16.3 SiteMapDataSource控件
SiteMapDataSource控件是站点地图数据的数据源,站点数据则由为站点配置的站点地图提供程序进行存储。SiteMapDataSource控件使那些并非专门作为站点导航控件的Web服务器控件(如TreeView、Menu和DropDownList控件)能够绑定到分层的站点地图数据。可以使用这些Web服务器控件将站点地图显示一个为目录,或者对站点进行主动式导航。
16.3.1 绑定站点地图
创建好站点地图文件—Web.sitemap文件之后,就可以通过SiteMapDataSource控件将站点地图文件绑定到Web服务器控件(如TreeView、Menu和DropDownList控件)里,从而在页面上显示这些地图数据。示例如代码清单16-6所示。
代码清单16-6 Home.Master
<%@Master Language="C#"AutoEventWireup="true"CodeBehind="Home.master.cs"
Inherits="_16_3.Home"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1"runat="server">
<table border="1"cellpadding="0"style="width:700px;height:280px;">
<tr>
<td valign="top"style="width:271px;">
<table border="0"cellspacing="0"cellpadding="0">
<tr>
<td align="center">
Menu控件例子
</td>
</tr>
<tr>
<td>
<asp:Menu ID="Menu1"runat="server"
DataSourceID="SiteMapDataSource1">
</asp:Menu>
</td>
</tr>
</table>
</td>
<td style="width:18px;">
 
</td>
<td valign="top"style="width:311px;">
<table border="0"cellspacing="0"cellpadding="0">
<tr>
<td align="center">
TreeView控件例子
</td>
</tr>
<tr>
<td>
<asp:TreeView ID="TreeView1"runat="server"
DataSourceID="SiteMapDataSource1">
</asp:TreeView>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="3">
<asp:ContentPlaceHolder ID="ContentPlaceHolder1"runat="server">
</asp:ContentPlaceHolder>
</td>
</tr>
</table>
<asp:SiteMapDataSource ID="SiteMapDataSource1"runat="server"/>
</form>
</body>
</html>
在代码清单16-6中,首先声明了一个SiteMapDataSource控件。如:
<asp:SiteMapDataSource ID="SiteMapDataSource1"runat="server"/>
该控件会自动读取站点地图文件Web.sitemap的内容,而无须编写任何代码。
声明好SiteMapDataSource控件之后,剩下的最后任务是选择用来显示站点地图数据的控件。为了演示的需要,在这里同时使用了TreeView控件和Menu控件,并通过TreeView控件和Menu控件的DataSourceID属性将其绑定到SiteMapDataSource。如下所示:
<asp:Menu ID="Menu1"runat="server"DataSourceID="SiteMapDataSource1">
</asp:Menu>
或者
<asp:TreeView ID="TreeView1"runat="server"DataSourceID="SiteMapDataSource1">
</asp:TreeView>
运行上面的Home.Master母版页,结果如图16-11所示。
图 16-11 Home.Master母版页的测试结果
最后需要说明的是,为了能够使站点导航更加具有重用性,通常将站点导航功能设计在母版页内。实际上,这也是母版页价值的所在。
16.3.2 自定义显示站点地图
利用SiteMapDataSource控件,除了默认地可以从根节点完全显示站点地图文件的结构之外,还可以根据自己的需要对站点地图文件进行自定义显示。
1.使用ShowStartingNode属性跳过根节点显示
我们知道,默认情况下的站点地图树是从网站地图的单个根节点开始。但有时候并不希望它这样显示,我们希望它跳过根节点进行显示。
如在前面的示例里(代码清单16-4中Web.sitemap文件),你可能并不喜欢主页节点突出的方式。如果希望跳过主页节点进行显示,可以将SiteMapDataSource控件的ShowStartingNode属性设置为false。如下面的代码所示:
<asp:SiteMapDataSource ID="SiteMapDataSource1"runat="server"
ShowStartingNode="false"/>
这样,页面的Web服务器控件就会跳过根节点主页进行显示,如图16-12所示。
图 16-12 使用ShowStartingNode属性跳过根节点显示
2.使用StartFromCurrentNode属性从当前节点开始显示
除了可以跳过根节点进行显示,还可以从当前节点开始只显示完整站点地图的一部分。例如,可以用某个控件(如TreeView控件)显示从当前节点开始的层次中的所有内容。要实现这一设计,只需把SiteMapDataSource控件的StartFromCurrentNode属性设置为true。如下面的代码所示:
<asp:SiteMapDataSource ID="SiteMapDataSource1"runat="server"
StartFromCurrentNode="true"/>
这样,SiteMapDataSource控件就会根据当前打开的页面来判断所要显示的节点内容。如果现在打开的是硬件节点((Hrdware.aspx)的页面,这时SiteMapDataSource控件就会相应的显示硬件节点下的所有节点,如图16-13所示。
图 16-13 使用StartFromCurrentNode属性从当前节点开始显示
注意 要让这项设置真正起作用,ASP.NET必须在Web.sitemap文件里找到和当前URL匹配的页面(如Hardware.aspx页面)。否则,它不会知道当前位置,也不会为绑定控件提供任何导航信息。
3.使用StartingNodeUrl属性从指定节点开始显示
利用SiteMapDataSource控件的StartingNodeUrl属性可以让你自己决定从站点地图文件的哪个URL开始显示。其中,StartingNodeUrl属性接受的URL应成为TreeView和Menu控件中第一个节点的URL。这个值必须和Web.sitemap文件中该节点的url特性完全匹配。例如,如果指定StartingNodeUrl属性的值为“~/Products.aspx”,那么页面的TreeView和Menu控件的第一个节点就是产品信息节点,并且也只会看到这个节点之下的节点。如下面的代码所示:
<asp:SiteMapDataSource ID="SiteMapDataSource1"runat="server"
StartingNodeUrl="~/Products.aspx"/>
这时,SiteMapDataSource控件就只会从产品信息节点开始读取数据,运行结果如图16-14所示。
4.使用StartingNodeOffset属性从指定节点开始显示
除了可以使用StartingNodeUrl属性从指定的URL节点开始显示之外,还可以通过使用StartingNodeOffset属性来指定层次进行显示。通常情况下,StartingNodeOffset属性的取值有以下三种情况:
1)如果StartingNodeOffset属性设置为非0的值,则它会影响起始节点以及由SiteMapDataSource控件基于该节点公开的站点地图数据层次结构。StartingNodeOffset的值为一个负整数或正整数,该值标识从StartFromCurrentNode和StartingNodeUrl属性所标识的起始节点沿站点地图层次结构上移(负整数)或下移(正整数)的层级数,以便对数据源控件公开的子树的起始节点进行偏移。
示例如下面的代码所示:
<asp:SiteMapDataSource ID="SiteMapDataSource1"runat="server"
StartingNodeOffset="-1"
StartFromCurrentNode="true"/>
在上面的代码中,将SiteMapDataSource控件的StartingNodeOffset属性设置为-1,并将StartFromCurrentNode属性设置为true。它表示从当前页面的节点向上移动一个节点进行显示,即假设现在打开的是硬件节点的页面((Hrdware.aspx),这时它会向上移动一个节点(即产品信息)进行显示。结果如图16-15所示。
图 16-14 使用StartingNodeUrl属性从指定节点开始显示
图 16-15 StartingNodeOffset="-1"且StartFrom CurrentNode="true"的显示结果
如果将SiteMapDataSource控件设置如下:
<asp:SiteMapDataSource ID="SiteMapDataSource1"runat="server"
StartingNodeOffset="1"StartingNodeUrl="~/Default.aspx"/>
它表示从当前页面((Dfault.aspx)的节点向上移动一个节点进行显示(即产品信息),结果与图16-15一样。
2)如果StartingNodeOffset属性设置为负数-n,则由数据源控件公开的子树的开始节点,是在层次结构中位于所标识开始节点之上n个级别的祖先节点。如果在层次结构树中,位于所标识开始节点之上的祖先节点的级别数小于n,子树的开始节点就是站点地图层次结构中的根节点。
3)如果StartingNodeOffset属性设置为正数+n,则所公开子树的开始节点是位于所标识开始节点之下n个级别的子节点。由于层次结构中可能存在多个子节点的分支,因此,如果可能的话,SiteMapDataSource会尝试根据所标识起始节点与表示当前被请求页的节点之间的路径,直接解析子节点。如果表示当前被请求页的节点不在所标识起始节点的子树中,则忽略StartingNodeOffset属性的值。如果表示当前被请求的页的节点与位于其上方的所标识开始节点之间的层级差距小于n,则使用当前被请求的页作为开始节点。