链接的内容是"下一个主题"。当你点击这个链接的时候,用户控件调用SiteMapNode对象来检测当前页面的附近是否存在页面。代码检测SiteMap.CurrentNode属性,看它的前面是否有页面(SiteMap.CurrentNode.PreviousSibling)、它的后面是否有页面(SiteMap.CurrentNode.NextSibling)。如果存在页面,用户控件就显示超链接,并把超链接的NavigateUrl属性设置为附近节点的Url属性。
如果你点击页面左部的Treeview链接,可以看到用户控件是如何自动地显示适当的"前一个主题"和"后一个主题"链接的。用户控件还显示了另外一个超链接,你可以点击它返回主页。如果你查看这个超链接如何工作就会发现,该控件利用了主页<siteMapNode>元素中的自定义属性"customAttribute"。该控件演示了如何使用SiteMapNode的默认索引器来检索自定义属性的值。
<script language="VB" runat="server">
Sub Page_Load()
If (Not SiteMap.CurrentNode.NextSibling Is Nothing) Then
NextTopic.NavigateUrl = SiteMap.CurrentNode.NextSibling.Url
Else
NextTopic.Visible = false
Separator.Visible = false
End If
If (Not SiteMap.CurrentNode.PreviousSibling Is Nothing)
PrevTopic.NavigateUrl = SiteMap.CurrentNode.PreviousSibling.Url
Else
PrevTopic.Visible = false
Separator.Visible = false
End If
''使用FindSiteMapNode查找URL中的节点并提取一些信息
Dim rootNode as SiteMapNode = SiteMap.Provider.FindSiteMapNode("~/Home.aspx")
GoHome.NavigateUrl = rootNode.Url
GoHome.ToolTip = rootNode.Description
GoHome.Text = rootNode("customAttribute")
End Sub
</script>
站点导航的安全性
站点导航特性可以根据授权规则过虑提供程序所返回的SiteMapNode实例。XmlSiteMapProvider可以根据当前网站使用的文件和URL授权规则过虑节点。
下面的例子使用了窗体授权规则,预定义的用户凭证存储在web.config中。在global.asax中,根据用户名,用户的角色都被附加到当前的请求上。在web.config中,嵌套在<siteMap>元素之下的站点地图提供程序使用的<add>元素的securityTrimmingEnabled属性被设置为真。同时,web.config文件的末尾定义了一组URL授权规则。当你运行示例并登陆之后,XmlSiteMapProvider会自动地依据用户所属的角色和web.config中定义的授权规则来对SiteMapNode执行授权检测。
请使用下面三个帐户之一运行示例:
· Userid: SectionOne Password: SectionOne
· Userid: SectionTwo Password: SectionTwo
· Userid: AllSections Password: AllSections
在页面的右上角有一个"退出"链接,因此你可以用不同的帐号登陆和退出。请注意,根据你登陆所使用的帐号不同,导航UI显示的Treeview和Menu控件会自动地反映该用户所获得的访问权限。提供程序自动地过虑了返回的节点--实现这种功能不需要额外的代码。用"SectionOne"帐号登陆的时候,只在左边的Treeview控件中显示"SectionOne"链接和外部链接。用"SectionTwo"帐号登陆的时候,只在左边的Treeview控件中显示"SectionTwo"链接和外部链接。用"AllSections"帐