揭开站点导航的面纱(二)动态修改内存中的站点地图


 在上一篇博文中我们通过一个简单的例子了解了站点导航的内容。

这一篇博文,我们来看一下动态修改内存中的站点地图,那么到底是什么意思呢?

在日常浏览中,我们常常会发现类似于http://new.com/id=3&page=12这样的格式,遇上这样的问题,那么文章列表中通常都有多篇,我们总不能把这些都放到站点地图中去,何况文章ID、栏目编号、商品分类或者商品ID也不是我们事先能够预料到的,那么站点地图里没有,外面就不能显示,该怎么办呢?这就需要用到动态修改内存中的站点地图了。

如上面提出的问题,我们假设有一个文章管理系统结构如下:

首页-新闻-国际新闻(列表)

那么可以假设国际新闻这一级的页面是list.aspx,不同的栏目会有不同的ID,那么地址结构就假设如下:

xxx.com--~/news/--list.aspx?id=3&page=12

这样一个结构,我们对新闻列表页的处理就可以只在站点地图中静态地写上url="~/news/list.aspx"。那么如果在别人浏览时呈现出上面的结构呢,我们接下来处理。

Web.sitemap:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="a.aspx" title="首页"  description="1">
        <siteMapNode url="b.aspx" title="根目录B页"  description="2" />
        <siteMapNode url="Default.aspx" title="Default页"  description="3" />
      <siteMapNode url="" title="one目录" description="4">
        <siteMapNode url="~/one/a.aspx" title="one目录下的a" description="5"/>
        <siteMapNode url="~/one/b.aspx" title="one目录下的b" description="6"/>
        <siteMapNode url="" title="one目录下的once目录" description="7">
          <siteMapNode url="~/one/once/a.aspx" title="one目录下的once目录下的a" description="8"/>
          <siteMapNode url="~/one/once/b.aspx" title="one目录下的once目录下的b" description="9"/>
        </siteMapNode>
      </siteMapNode>
      <siteMapNode url="" title="two目录" description="10">
        <siteMapNode url="~/two/a.aspx" title="two目录下的a" description="11"/>
        <siteMapNode url="~/two/b.aspx" title="two目录下的b" description="12"/>
      </siteMapNode>

      <siteMapNode url="sitemap.aspx" title="动态修改内存中" description="动态修改内存中的站点地图"/>
    </siteMapNode>
</siteMap>

主要就是用到title为动态修改内存中的这一句来演示。

然后在演示页面sitemap.aspx中放一个SitemapPath控件,注意设置它的renderCurrentNodeAsLink为true(指示当前结点为链接)

页面的后台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Navigation
{
    public partial class sitemap : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //首先我们在这里注册一个事件,也就是说在访问CurrentNode属性的时候触发这个事件
            SiteMap.SiteMapResolve+=new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
        }
        SiteMapNode SiteMap_SiteMapResolve(object sender,SiteMapResolveEventArgs e)
        {
            //我们自定义的处理方法 获取并创建当前节点的副本,并同时复制他的上级节点
            SiteMapNode CurrentNode = SiteMap.CurrentNode.Clone(true);

            SiteMapNode TempNode = CurrentNode;

            int id = nid();
            int page = npage();

            //从下面方法中得到变量
            if (id>0)
            {
                TempNode.Url = TempNode.Url + "?id=" + id.ToString();
            }
            if (id>0 && page>=0)
            {
                TempNode.Url = TempNode.Url + "&page=" + page.ToString();
            }
            else if (page>0)
            {
                TempNode.Url = TempNode.Url + "?page=" + page.ToString();
            }
            return TempNode;
        }
        //随便设置一个数。
        private int nid()
        {
            return 3;
        }
        private int npage()
        {
            return 12;
        }
    }
}

解释:上面的nid()和npage(),是用来获取参数的两个方法,实际中根据实际情况而定。

运行,我们看看这个链接的属性:


此,我们就很简单的实现了动态修改内存中的站点地图了!

站点导航,是我们在BS开发中非常常用的,所以我们还是很有必要深刻掌握的,接下来还会发相关的文章,与大家一讨论学习!

转载请说明出处!

  • 14
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值