SiteMapDataSource
控件通过网站地图提供者(如 XmlSiteMapProvider
,ASP.NET 默认的网站地图提供者)获取网站地图数据。可以配置 SiteMapDataSource
控件以返回全部网站地图节点的集合或部分子集。这种情况适用于存在跨模板页之间的分布式导航结构时,以便在不同的模板页中显示网站地图的其中一部分。
要想使用这些网站导航控件,必须先在 Web.sitemap 文件中对网站结构进行描述,并创建文件路径被列在网站地图里的 .aspx 文件。
创建 Web.sitemap 文件
-
在网站根目录创建文件 Web.sitemap,并输入下例代码:
<?xml version="1.0" encoding="utf-8" ?> <siteMap> </siteMap>
-
为
siteMap
元素创建根元素siteMapNode
,并定义下列参数:-
title。指定网站地图节点的标题,在页面中显示成链接的文本内容。
-
url。指定 Web 页面的 URL。可以使用完整 URL 或相关 URL(如 ~/Default.aspx)地址。波浪符(~)代表应用程序的根目录。接着分别为每个 URL 创建相应的 Web 页面并将页面列在网站地图中(因为应用程序会在所列 URL 不存在或重复出现时产生错误)。当然,也可以保持该参数值为空。但是作为本例要实现的目标,请在 .aspx 文件中对该参数进行设置。
提示:一个网站地图中只允许出现唯一一个
siteMapNode
根元素,但是根元素却可以包含若干数量的siteMapNode
子元素。 -
-
为
siteMapNode
根元素创建siteMapNode
子元素。并按照上述步骤设置相同的参数。 -
为上一个
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>
-
保存并关闭 Web.sitemap 文件。
在页面中添加网站导航
-
分别为 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>
-
保存文件。
更改导航控件返回的起始节点
-
在 3 层网站地图的 .aspx 页面中,找到
SiteMapDataSource
控件,代码定义可能是这样:<asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" />
-
然后更改上例代码的内容:
<asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" StartingNodeUrl="~/Services.aspx" />
-
保存文件并打开浏览器进行查看。
结果发现 Training.aspx 页面中的导航结构与其他两个页面不一样。因为结构开始于第二个节点,表明
SiteMapPath
控件没有起到任何作用,原因就是它不需要使用SiteMapDataSource
控件就可以直接从提供者那里获取到网站地图的数据。下面列出的一些其他选项,这些选项只在需要改变节点的起始位置时才有效:
-
设置
StartFromCurrentNode
属性为true
。即从指向当前页面的节点处开始获取网站地图结构。
-
设置 StartingNodeOffset
属性为 2。即从根目录以下 2 层深度的子目录作为开始,并沿着当前页面的路径获取网站地图结构。
隐藏起始节点
-
在 3 层网站地图的 .aspx 页面中,找到
SiteMapDataSource
控件,代码定义可能是这样:<asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" />
-
然后更改上例代码的内容:
<asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" ShowStartingNode="~/Services.aspx" />
-
保存文件并打开浏览器进行查看。
结果发现页面中的导航结构与其他两个页面不同。显示结果与在设置
StartingNodeOffset
属性值为 1 或设置StartingNodeUrl
属性值为 ~/Services.aspx 时不一样,那是因为网站地图节点集没有被整个网站地图只有一个分支的限制所影响,从而可以顺利显示 Products 节点。提示:如果网站地图中的起始节点位置比根节点更深,还可以将
StartingNodeOffset
属性值设置成负数。通常用于StartFromCurrentNode
属性值为true
并以当前节点的父节点作为起始显示网站地图的情况下。