16.2 SiteMapPath服务器控件
通过ASP.NET 2.0提供的新服务器控件SiteMapPath很容易使用刚才创建的.sitemap文件。这个新控件位于Visual Studio 2005 IDE的Navigation部分。
SiteMapPath控件可以创建导航功能,用户可能以前创建过它,也可能在Internet的Web页面上看到过它。SiteMapPath控件会创建所谓的“面包屑导航(breadcrumb navigation)”,这是一种线性路径,定义了终端用户在导航结构中的位置。Web站点Reuters.com如图16-1所示,它就使用这种类型的导航。黑箭头指向页面上使用的面包屑导航。

图 16-1
这类导航系统的作用是向终端用户显示它们与站点其他内容的相互关系。传统上,编写这类导航系统是比较困难的,但现在有了SiteMapPath服务器控件,就很容易编写出这类导航系统。
首先创建一个应用程序,它包含程序清单16-1中创建的Web.sitemap文件。之后创建一个Web窗体MarketsUS.aspx,这个文件在Web.sitemap文件中定义为应用程序的最底层文件。
SiteMapPath控件很容易使用,甚至不需要用数据源控件将它绑定到Web.sitemap文件上,以获得其中的所有信息。只需把一个SiteMapPath控件拖放到MarketsUS.aspx页面上。最后,应得到如程序清单16-2所示的页面。
程序清单16-2 使用Web.sitemap文件和SiteMapPath服务器控件
<%@ Page Language="VB" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Using the SiteMapPath Server Control</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SiteMapPath ID="Sitemappath1" runat="server">
</asp:SiteMapPath>
</form>
</body>
</html>
这真是很简单。运行这个页面,结果如图16-2所示。

图 16-2
这个屏幕图显示MarketsUS.aspx上的美国市场报告页面。终端用户可以看到,这个页面在站点的Markets部分,而Markets在站点的Finance部分。通过面包屑导航,终端用户可以理解站点的结构,知道它们在什么位置,也可以快速选择链接,以导航到站点的任意位置上。
如果把鼠标停留在链接上几秒种,就会出现一个工具提示,如图16-3所示。

图 16-3
这个工具提示的内容是The Latest Financial Information,它来自于Web.sitemap文件中<siteMapNode>元素的description属性。
<siteMapNode title="Finance" description="The Latest Financial Information"
url="Finance.aspx">
SiteMapPath控件会自动工作,不需要用户的参与。只需把基本控件添加到页面上,该控件就会自动创建刚才的面包屑导航系统。但是,可以使用下面几节介绍的属性修改控件的外观和行为。
16.2.1 PathSeparator属性
SiteMapPath控件的一个重要的样式属性是PathSeparator。SiteMapPath控件默认使用大于号(>)分隔链接元素。给PathSeparator属性重新指定一个新值,就可以改变这一点。程序清单16-3演示了这个属性的用法。
程序清单16-3 改变PathSeparator的值
<asp:SiteMapPath ID="Sitemappath1" runat="server" PathSeparator=" | ">
</asp:SiteMapPath>
或
<asp:SiteMapPath ID="Sitemappath1" runat="server">
<PathSeparatorTemplate> | </PathSeparatorTemplate>
</asp:SiteMapPath>
这个例子中的SiteMapPath控件使用了竖杠符号(|),它位于回车键的上方。运行代码,结果如图16-4所示。

图 16-4
可以在SiteMapPath控件中使用PathSeparator属性或<PathSeparatorTemplate>元素。
使用PathSeparator属性或<PathSeparatorTemplate>元素时,很容易指定要使用什么符号分隔面包屑导航系统中的链接。也可以给这个竖杠符号指定一些可视化样式。为此,给SiteMapPath控件添加一个<PathSeparatorStyle>节点,如程序清单16-4所示。
程序清单16-4 给PathSeparator属性添加样式
<asp:SiteMapPath ID="Sitemappath1" runat="server" PathSeparator=" | ">
<PathSeparatorStyle Font-Bold="true" Font-Names="Verdana" ForeColor="#663333"
BackColor="#cccc66"></PathSeparatorStyle>
</asp:SiteMapPath>
这似乎不太美观(笔者不擅长设计),但使用<PathSeparatorStyle>元素和SiteMapPath控件,可以改变分隔符元素的可视化外观。结果如图16-5所示。

图 16-5
使用这些结构,还可以把图像添加为分隔符,如程序清单16-5所示。
程序清单16-5 把图像用作分隔符
<%@ Page Language="VB" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Using the SiteMapPath Server Control</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SiteMapPath ID="SiteMapPath1" runat="server">
<PathSeparatorTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl="divider.gif" />
</PathSeparatorTemplate>
</asp:SiteMapPath>
</form>
</body>
</html>
要把图像用作链接之间的分隔符,可以使用<PathSeparatorTemplate>元素,在该元素中放置一个Image控件。实际上,可以在SiteMapPath控件生成的导航链接之间放置任意类型的控件。
16.2.2 PathDirection 属性
使用SiteMapPath控件时,另一个有趣的属性是PathDirection,这个属性改变输出中生成的链接的方向。这个属性只有两个值:RootToCurrent和CurrentToRoot。
Root链接是显示中的第一个链接,它通常是主页。Current链接是当前显示的页面的链接。这个属性默认设置为RootToCurrent。把例子改为CurrentToRoot,就会生成如图16-6所示的结果。

图 16-6
16.2.3 ParentLevelsDisplayed属性
在一些情况下,导航系统会相当深。在程序清单16-1的站点地图上,有3级页面,这不是很理想。但是,一些人处理的站点可能有许多级页面。此时,使用SiteMapPath控件就比较愚蠢。因为这么做会显示非常长的页面列表。
在这种情况下,可以使用SiteMapPath控件中的ParentLevelsDisplayed属性。该属性设置后,会只显示指定深度的页面。因此,如果使用SiteMapPath控件和程序清单16-1中的Web.sitemap,就可以把ParentLevelsDisplayed属性的值设置为3,此时看不到页面有什么变化,但它已经显示为3级页面深度的路径。如果把这个值改为2,SiteMapPath控件就会构建为:
<asp:SiteMapPath ID="Sitemappath1" runat="server" ParentLevelsDisplayed="2">
</asp:SiteMapPath>
注意,这个改变的结果如图16-7所示。SiteMapPath控件只显示了2级页面深度,没有显示主页链接。

图 16-7
所显示的链接数量默认为没有限制,所以SiteMapPath控件会根据站点地图文件中指定的值生成特定数量的链接。
16.2.4 ShowToolTips属性
默认情况下,如果在Web.sitemap文件中使用了description属性,SiteMapPath控件会为每个链接生成工具提示。工具提示是终端用户把鼠标停留在SiteMapPath控件中的一个链接上时出现在屏幕上的文本。本章前面已介绍过这个功能。
我们常常不希望SiteMapPath控件为它生成的链接显示工具提示。此时,可以用两种方式关闭这个功能。第一种方式是忽略.sitemap文件中的description属性。如果从文件中删除了这些属性,SiteMapPath就不会在页面上显示工具提示了。
关闭工具提示功能的另一种方式是把ShowToolTips属性设置为False,如下所示:
<asp:SiteMapPath ID="Sitemappath1" runat="server" ShowToolTips="false">
</asp:SiteMapPath>
这样就会关闭工具提示功能,但仍可以使用.sitemap文件中的description属性。可能还要使用description属性,因为它可以跟踪文件中链接的作用。当在应用程序中处理成千上万个链接时,这是很有帮助的。
16.2.5 SiteMapPath控件的子元素
前面已经介绍过SiteMapPath控件的<PathSeparatorStyle>和<PathSeparatorTemplate>子元素,但SiteMapPath控件还包含其他子元素。表16-2中列出了它的所有子元素。
表 16-2
|
子 元 素 |
说 明 |
|
CurrentNodeStyle |
在当前显示的页面中,给SiteMapPath导航系统中的链接应用样式 |
|
CurrentNodeTemplate |
在当前显示的页面中,给SiteMapPath导航系统中的链接应用模板 |
|
NodeStyle |
给SiteMapPath导航系统中的所有链接应用样式。在CurrentNodeStyle或RootNodeStyle元素中应用的设置会替代这里的设置 |
|
NodeStyleTemplate |
给SiteMapPath导航系统中的所有链接应用模板。在CurrentNodeStyle或RootNodeStyle元素中应用的设置会替代这里的设置 |
|
PathSeparatorStyle |
给SiteMapPath导航系统中的链接分隔符应用样式 |
|
PathSeparatorTemplate |
给SiteMapPath导航系统中的链接分隔符应用模板 |
|
RootNodeStyle |
给SiteMapPath导航系统中的第一个链接(根链接)应用样式 |
|
RootNodeTemplate |
给SiteMapPath导航系统中的第一个链接应用模板 |







