16.5 SiteMap数据提供程序
在ASP.NET 2.0中,以DataSource控件的形式添加了一组全新的数据提供程序。本章前面介绍的其中一个新的DataSource控件是SiteMapDataSource,这个新的DataSource控件可处理站点地图和绑定到其上的控件。
一些控件不需要SiteMapDataSource控件来绑定到应用程序的站点地图上(站点地图一般存储在Web.sitemap文件中)。本章的前面介绍了使用SiteMapPath控件时不需要SiteMapDataSource控件。SiteMapPath控件可以直接处理Web.sitemap文件,不需要这个新的数据提供程序。
但一些导航控件如TreeView控件和DropDownList控件,就需要中间的SiteMapDataSource控件来提取站点导航信息。
SiteMapDataSource控件的使用很简单,如本章的例子所示。SiteMapDataSource控件的最简单形式如下所示:
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
SiteMapDataSource控件的这种形式只能获得树型结构的信息(如前面所示)。注意,有许多属性都可以改变数据在绑定到数据输出的控件中的显示方式。
16.5.1 ShowStartingNode属性
ShowStartingNode属性确定了.sitemap文件的根节点是否用所提取的节点对象集合来获得。这个属性带一个布尔值,默认设置为True。如果使用程序清单16-1中的Web.sitemap文件,就可以构建如程序清单16-25中所示的SiteMapdataSource控件,从集合中删除根节点。
程序清单16-25 从获得的节点集合中删除根节点
<%@ Page Language="VB" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Menu Server Control</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server"
ShowStartingNode="False" />
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1">
</asp:Menu>
</form>
</body>
</html>
这段代码生成的菜单如图16-28所示。

图 16-28
在这个屏幕图中,根节点已被删除,所显示的菜单从根节点的子节点开始。
16.5.2 StartFromCurrentNode属性
StartFromCurrentNode属性会让SiteMapDataProvider只提取从页面的当前节点开始的节点集合。该属性默认设置为False,表示SiteMapDataProvider总是提取所有的节点(从根节点开始到当前节点)。
对于这个例子,使用程序清单16-1中的.sitemap文件创建一个页面Markets.aspx。这个页面在节点集合的层次结构中是Finance节点的一个子节点,它还有两个子节点U.S. Market Report和NYSE。把StartFromCurrentNode属性设置为True的示例如程序清单16-26所示。
程序清单16-26 使用StartFromCurrentNode属性的MarketsUS.aspx页面
<%@ Page Language="VB" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Menu Server Control</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server"
StartFromCurrentNode="True" />
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1">
</asp:Menu>
</form>
</body>
</html>
添加这个属性后的结果如图16-29所示。

图 16-29
16.5.3 StartingNodeOffset属性
StartingNodeOffset属性带一个整数值,表示层次结构集合的起点。这个属性默认设置为0,表示通过SiteMapDataSource控件获取的节点集合从根节点开始。在程序清单16-1的例子中,集合是从Default.aspx上的Home页面开始的,在本章的许多例子中都使用该页面。
如果把这个属性的值设置为1,集合的起点就与默认的起点(Default.aspx上的Home页面)之间相隔1个空格。例如,如果使用SiteMapDataSource控件的页面是MarketsUS.aspx,则节点集合就从Finance页面(Finance.aspx)开始。
Home 偏移 0
News 偏移1
U.S. 偏移2
World 偏移2
Technology 偏移2
Sports 偏移2
Finance 偏移1
Quotes 偏移2
Markets 偏移2
U.S. Market Report 偏移3
NYSE 偏移3
Funds 偏移2
Weather 偏移1
在这个层次结构中,说明了每个节点与根节点的偏移量。因此,如果把StartingNodeOffset属性设置为1,且浏览到U.S. Market Report页面上,节点集合就从Finance页面(Finance.aspx)开始,根节点的其他子节点(News和Weather)就不会出现在节点集合中。
16.5.4 StartingNodeUrl属性
StartingNodeUrl属性可以指定在.sitemap文件中找到的页面,节点集合就从该页面开始。该属性的值默认为空,但设置为Finance.aspx时,集合就把Finance页面作为节点集合的根节点,从这个页面开始。程序清单16-27显示了使用StartingNodeUrl属性的一个例子。
程序清单16-27 使用StartingNodeUrl属性
<%@ Page Language="VB" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Menu Server Control</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server"
StartingNodeUrl="Finance.aspx" />
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1">
</asp:Menu>
</form>
</body>
</html>
遇到StartingNodeUrl属性值时,就把其值与Web.sitemap文件中的url属性比较。如果它们匹配,就把匹配的页面用作SiteMapDataSource控件获得的节点集合中的根节点。







