ASP.NET 实践:过滤用 SiteMapDataSource 控件取回的节点

SiteMapDataSource 控件通过网站地图提供者(如 XmlSiteMapProvider,ASP.NET 默认的网站地图提供者)获取网站地图数据。可以配置 SiteMapDataSource 控件以返回全部网站地图节点的集合或部分子集。这种情况适用于存在跨模板页之间的分布式导航结构时,以便在不同的模板页中显示网站地图的其中一部分。

要想使用这些网站导航控件,必须先在 Web.sitemap 文件中对网站结构进行描述,并创建文件路径被列在网站地图里的 .aspx 文件。

创建 Web.sitemap 文件
  1. 在网站根目录创建文件 Web.sitemap,并输入下例代码:

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap>
    </siteMap>
    
  2. siteMap 元素创建根元素 siteMapNode,并定义下列参数:

    • title。指定网站地图节点的标题,在页面中显示成链接的文本内容。

    • url。指定 Web 页面的 URL。可以使用完整 URL 或相关 URL(如 ~/Default.aspx)地址。波浪符(~)代表应用程序的根目录。接着分别为每个 URL 创建相应的 Web 页面并将页面列在网站地图中(因为应用程序会在所列 URL 不存在或重复出现时产生错误)。当然,也可以保持该参数值为空。但是作为本例要实现的目标,请在 .aspx 文件中对该参数进行设置。

    提示:一个网站地图中只允许出现唯一一个 siteMapNode 根元素,但是根元素却可以包含若干数量的 siteMapNode 子元素。

  3. siteMapNode 根元素创建 siteMapNode 子元素。并按照上述步骤设置相同的参数。

  4. 为上一个 siteMapNode 元素创建 siteMapNode 子元素。并按照上述步骤设置相同的参数。作为本例要实现的目标,网站地图必须使用至少拥有 3 层 siteMapNode 以上深度的元素结构。

    这时候的 Web.sitemap 文件内容可能是这样:

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap>
      <siteMapNode title="Home" url="~/Default.aspx" roles="*">
        <siteMapNode title="Services" url="~/Services.aspx " >
          <siteMapNode title="Training" url="~/Training.aspx" />
        </siteMapNode>
        <siteMapNode title="Products" url="" />
      </siteMapNode>
    </siteMap>
    
  5. 保存并关闭 Web.sitemap 文件。

在页面中添加网站导航
  1. 分别为 Web.sitemap 文件中列表在 url 参数中的文件路径创建相应的 .aspx 页面。为这些 .aspx 文件加入下例代码以便在控件中显示网站地图数据。如果某个 .aspx 文件在网站地图中被漏列,它将无法在网站导航控件中显示。

    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
      <title>Simple Navigation Controls</title>
    </head>
    <body>
      <form id="form1" runat="server">
      <div>
    
      <h2>Using SiteMapPath</h2>
      <asp:SiteMapPath ID="SiteMapPath1" Runat="server">
      </asp:SiteMapPath>
    
    
      <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" />
    
      <h2>Using TreeView</h2>
      <asp:TreeView ID="TreeView1" Runat="Server"
        DataSourceID="SiteMapDataSource1">
      </asp:TreeView>
    
      <h2>Using Menu</h2>
      <asp:Menu ID="Menu2" Runat="server"
        DataSourceID="SiteMapDataSource1">
      </asp:Menu>
      
      <h2>Using a Horizontal Menu</h2>
      <asp:Menu ID="Menu1" Runat="server"
        DataSourceID="SiteMapDataSource1"
        Orientation="Horizontal" 
        StaticDisplayLevels="2" >
      </asp:Menu>
      
      </div>
      </form>
    </body>
    </html>
    
  2. 保存文件。

更改导航控件返回的起始节点
  1. 在 3 层网站地图的 .aspx 页面中,找到 SiteMapDataSource 控件,代码定义可能是这样:

    <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" />
    
  2. 然后更改上例代码的内容:

    <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server"
      StartingNodeUrl="~/Services.aspx" />
    
  3. 保存文件并打开浏览器进行查看。

    结果发现 Training.aspx 页面中的导航结构与其他两个页面不一样。因为结构开始于第二个节点,表明 SiteMapPath 控件没有起到任何作用,原因就是它不需要使用 SiteMapDataSource 控件就可以直接从提供者那里获取到网站地图的数据。

    下面列出的一些其他选项,这些选项只在需要改变节点的起始位置时才有效:

    • 设置 StartFromCurrentNode 属性为 true。即从指向当前页面的节点处开始获取网站地图结构。

设置 StartingNodeOffset 属性为 2。即从根目录以下 2 层深度的子目录作为开始,并沿着当前页面的路径获取网站地图结构。

隐藏起始节点
  1. 在 3 层网站地图的 .aspx 页面中,找到 SiteMapDataSource 控件,代码定义可能是这样:

    <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" />
    
  2. 然后更改上例代码的内容:

    <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server"
      ShowStartingNode="~/Services.aspx" />
    
  3. 保存文件并打开浏览器进行查看。

    结果发现页面中的导航结构与其他两个页面不同。显示结果与在设置 StartingNodeOffset 属性值为 1 或设置 StartingNodeUrl 属性值为 ~/Services.aspx 时不一样,那是因为网站地图节点集没有被整个网站地图只有一个分支的限制所影响,从而可以顺利显示 Products 节点。

    提示:如果网站地图中的起始节点位置比根节点更深,还可以将 StartingNodeOffset 属性值设置成负数。通常用于 StartFromCurrentNode 属性值为 true 并以当前节点的父节点作为起始显示网站地图的情况下。

转载于:https://www.cnblogs.com/Laeb/archive/2006/12/11/589019.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值