如何:筛选 SiteMapDataSource Web 服务器控件检索到的节点

更新:2007 年 11 月

SiteMapDataSource 控件从站点地图提供程序(例如 XmlSiteMapProvider,它是 ASP.NET 的默认站点地图提供程序)检索站点地图数据。您可以将 SiteMapDataSource 控件配置为返回站点地图节点的全集或子集。如果需要在一页上显示多个导航结构并且每个导航结构显示单独的站点地图部分,这非常有用。如果需要将站点导航元素分布在站点中不同的母版页上并且每个母版页显示整个站点地图的不同部分,这也非常有用。

若要使用这些站点导航控件,您必须在 Web.sitemap 文件中描述站点的结构,并创建在站点地图中列出的 .aspx 文件。

创建 Web.sitemap 文件

  1. 在网站的根目录中创建一个新文件,并将其命名为 Web.sitemap。在文件中放置以下必需的代码:

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap>
    </siteMap>
    
  2. 创建一个根 siteMapNode 元素作为 siteMap 元素的子级,定义下面的属性:

    • title   为站点地图节点指定一个标题,该标题将显示为网页的链接文本。

    • url   为网页指定 URL。可以使用完全限定 URL 或相对 URL,例如 ~/Default.aspx。腭化符 (~) 用于指示应用程序的根。在后面的过程中,您将为站点地图中列出的每个 URL 创建网页,因为如果列出的 URL 不存在(或者 URL 有重复),应用程序就会失败。可以保留此属性为空,但对于此示例,请将其设置为可以编辑的 .aspx 文件。

    ms178423.alert_note(zh-cn,VS.90).gif说明:

    一个站点地图中只能有一个根 siteMapNode 元素,但这个根可以包含任意多个子 siteMapNode 元素。

  3. 创建一个 siteMapNode 元素作为根 siteMapNode 元素的子元素。按照上一步的做法,设置相同的属性。

  4. 创建一个 siteMapNode 元素作为上一个 siteMapNode 元素的子元素。按照上一步的做法,设置相同的属性。对于此示例,站点地图必须有三级 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="VB" %>
    
    <!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 id="Head1" 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>
    
    <%@ 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. 在站点地图中深度为三级的 .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 可以检索站点地图结构,从根节点往下两个节点的深度开始,沿着到当前页的路径进行。

隐藏起始节点

  1. 在站点地图中深度为三级的 .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”节点。

    ms178423.alert_note(zh-cn,VS.90).gif说明:

    如果起始节点的嵌套深度比站点地图的根节点深,您还可以将 StartingNodeOffset 属性设置为一个负数。当 StartFromCurrentNode 属性设置为 true 且想要从当前节点的父节点开始显示站点地图时,这往往很有用。

请参见

任务

如何:自定义 SiteMapPath Web 服务器控件的外观

概念

实现 ASP.NET 站点地图提供程序

ASP.NET 站点地图安全性调整

保证 ASP.NET 站点导航的安全

保证数据访问的安全

其他资源

寄宿环境中的 ASP.NET 应用程序安全性