在ASP.NET 2.0中建立站点导航层次(1)

上一篇 / 下一篇  2007-03-16 10:22:00 / 个人分类:心得笔记

站点导航提供程序--ASP.NET 2.0中的站点导航提供程序暴露了应用程序中的页面的导航信息,它允许你单独地定义站点的结构,而不用考虑页面的实际物理布局。默认的站点导航提供程序是基于XML的,但是你也可以通过编写自定义的提供程序,从任何后端位置暴露这些信息。

  站点导航API--站点导航API用于在应用程序的代码中访问站点导航信息,它摘录了导航信息存储的细节。你可以使用API来编程访问应用程序的导航节点。

  导航控件--导航控件为页面之间的导航提供了通用的UI,例如树视图、菜单和breadcrumb("面包屑",一种显示当前所在页面的控件)。这些控件利用ASP.NET 2.0中的站点导航服务来检索你给站点定义的结构。SiteMapDataSource控件还允许你把其它UI控件绑定到站点导航数据。

  网站经常需要显示导航数据,来指导用户如何使用站点。ASP.NET中的导航特性允许开发者简单地定义导航数据,并根据这些信息来显示UI。

  站点导航API是一种用于访问站点导航数据的基于提供程序(provider)的编程内容。该API把导航数据存储在XML文件中,并通过一组SiteMapNode类来暴露这些数据。应用程序和控件开发者可以构建SiteMapNode实例并使用这些信息来显示导航界面。

  面向导航的服务器控件包括Menu、TreeView、SiteMapPath和SiteMapDataSource控件。这些控件都是建立在站点导航类的顶端的,它们使用和显示导航数据的时候都是不考虑数据存储的特定细节问题的。Menu和TreeView控件还可以使用XML文件的数据和XMLDataSource控件的数据。

  Url映射特性允许开发者为不同URL请求的重映射(re-mapping)定义简单的规则。

  使用站点导航控件

  Menu、TreeView、SiteMapPath和SiteMapDataSource控件根据导航数据生成导航界面。导航数据可以存储在XML文件中,或者利用站点导航特性的基于提供程序的能力来保存。下面的例子演示了如何组合使用站点导航特性的不同控件。

  建立应用程序站点地图

  示例的导航结构存放在Web.sitemap文件中,在下面你可以看到站点地图文件。Web.sitemap文件包含一个顶层的元素。在元素内至少嵌套一个元素。在一个站点地图内必须有一个顶层的。站点导航特性需要一个根来确保沿着节点层次的访问最终汇聚到一个已知的节点。你可以在根元素下嵌套多个元素。此外,嵌套元素的深度是没有限制的。

  一个元素通常包含Url(链接)、Title(标题)和Description(描述)属性。Url属性指明与应用程序中的页面对应的路径。它也可以包含其它应用程序中的页面的路径,或者指向完全不同的网站的多个URL。在下面的例子中,所有的Url属性都使用应用程序相对语法来引用路径。Title属性用于显示导航数据UI的文本内容。例如,SiteMapPath控件把Title属性作为控件的超链接文本显示。如果提供了Description属性,服务器控件就把显示为工具条提示或ALT文本。开发者也可以给添加自定义属性,利用SiteMapNode类的默认索引器(indexer)就可以检索这些属性了。你可以查阅.NET框架组件文档找到更多的关于元素其它一些属性的信息。

  Web.sitemap的内容

以下是引用片段:
<siteMap>  
<siteMapNode title="Home" url="~/default.aspx" >  
<siteMapNode title="Introduction to ASP.NET" url="~/introduction/default.aspx">  
<siteMapNode title="What's New in Whidbey?" url="~/introduction/whatsnew.aspx"/>  
<siteMapNode title="Sample Applications (Starter Kits)" url="~/introduction/starterkits.aspx"/>  
<siteMapNode title="Introduction to Visual Web Developer" url="~/introduction/vwd.aspx"/>  
</siteMapNode>  
<siteMapNode title="Building A Web Application" url="~/development/default.aspx">  
<siteMapNode title="Building a Simple Application" url="~/development/simple/default.aspx">  
<siteMapNode title="Introduction to ASP.NET pages" url="~/development/simple/pages.aspx"/>  
……  
</siteMapNode>  
</siteMapNode>  
</siteMap> 

  使用站点导航控件

  在Web页面上提供站点导航的最简单办法就是使用图形化的站点导航控件(SiteMapPath、TreeView和 Menu)。

  · SiteMapPath--一个breadcrumb控件,它检索用户的当前页面并显示页面的层次结构。这让用户可以导航回层次中其它的页面。SiteMapPath只能与SiteMapProvider一起使用,需要设置控件的SiteMapProvider属性。

  · TreeView--在Web页面上提供垂直的用户界面,它可以展开和收缩选中的节点,也可以提供检查框功能以供用户选择数据项。TreeView控件支持宣告式的或编程设置数据元素和数据源控件。如果你使用SiteMapDataSource控件,那么数据绑定就是自动进行的。

  · Menu--提供水平的或垂直的用户界面,当用户把鼠标放在一项上的时候会弹出子菜单。Menu控件支持宣告式的或编程设置数据元素或数据源控件。如果你使用SiteMapDataSource控件,数据绑定就是自动进行的。

  请注意,TreeView和Menu控件都可以用于非导航的情形。

  下表描述了TreeView和Menu之间的差别,以便于你能根据需要做出适当的选择。

  特性 Menu TreeView

  扩展 弹出 位置扩展

  根据需要下载 No Yes

  检查框 No Yes

  模板 Yes No

  布局 水平 & 垂直 垂直

  Style选项 Yes Yes

  选择模式 静态的、 动态的层次 层次或父/根/叶,或按数据项

在下面的例子中,你看到的TreeView和Menu控件为不同的区域和操作(例如NodeStyle和HoverNodeStyle)配置了一些样式属性。例子中的TreeView和Menu控件都连接到页面上的同一个SiteMapDataSource控件。SiteMapPath控件通过Web.config文件中设置的默认的SiteMapProvider来访问相同的数据。

以下是引用片段:
<asp:treeview ID="TreeView1" ForeColor="White" DataSourceId="SiteMapDataSource1" NodeIndent="0" NodeStyle-ChildNodesPadding="10" runat="server">  
<LevelStyles>  
<asp:TreeNodeStyle Font-Bold="true"/>  
<asp:TreeNodeStyle />  
<asp:TreeNodeStyle Font-Size="x-small"/>  
</LevelStyles>  
<nodestyle forecolor="White" HorizontalPadding="5"/>  
<SelectedNodeStyle backcolor="lightblue" forecolor="blue" />  
<HoverNodeStyle Font-UnderLine="true" />  
</asp:treeview>  
<asp:sitemappath id="SiteMapPath1" runat="server" />  
<asp:Menu ID="Menu1" DataSourceId="SiteMapDataSource1" runat="server">  
<DynamicSelectedStyle BackColor="lightblue" ForeColor="Blue" />  
<DynamicHoverStyle Font-Underline="true" />  
<StaticHoverStyle Font-Underline="true" />  
</asp:Menu>  
<asp:sitemapdatasource id="SiteMapDataSource1" runat="server" />

  使用站点导航API

  站点导航API是使用可配置的提供程序访问导航数据的编程抽象内容。站点导航提供程序把导航数据的存储细节信息与API的其它部分隔离开来。站点导航API通过SiteMap和SiteMapNode类来暴露导航数据。SiteMap类返回与当前页面对应的SiteMapNode实例。它还可以访问那些为站点导航特性配置的提供程序。SiteMapProvider为执行下面一些事务提供了丰富的API:

  · 依据当前的HttpContext或任意URL检索SiteMapNode实例。

  · 检索SiteMapNode的父或子节点。

  · 访问当前页面的SiteMapNode,以及整个导航层次中的根SiteMapNode。

  · 执行授权规则,这样就保证了提供程序只返回用户可以看见的节点。

  SiteMapNode实例暴露的基本导航信息和功能包括:

  · URL、Title和description属性,以及开发者给SiteMapNode添加的自定义属性。

  · 获取某个节点的父和子节点。

  · 在某个节点的前后节点之间进行导航。

  · 获取SiteMapProvider实例的指针,它返回一个节点。

  ASP.NET发布的时候带有XmlSiteMapProvider提供程序。该提供程序使用XML文件(web.sitemap)中的数据,并根据数据返回SiteMapNode实例。XmlSiteMapProvider有下面一些功能:

  · 多个站点地图(sitemap)文件可以链接在一起来构建一个"虚拟的"导航数据集合。

  · 多个XmlSiteMapProvider实例可以链接到一起来构建一个"虚拟的"导航数据集合。

  · 提供程序可以根据站点当前的文件授权和URL授权规则来返回过虑后的节点。

  有了SiteMapProvider指针之后,你就可以根据URL来检索特定节点的站点导航数据。它会让你获取站点导航数据中的SiteMapNode实例指针。可以检索任意SiteMapNode实例的能力和从任何SiteMapNode开始进行站点导航的能力组合在一起,使你能够轻易地遍历站点的导航数据。

  作为一名开发者,你也可以把导航数据用其它的格式进行存储(例如作为关系数据存储在数据库中)。接着你应该构建一个衍生自SiteMapProvider的自定义提供程序。

  使用站点导航类编程

  你可以在代码中编程获取导航数据。编程获取站点导航数据的出发点是SiteMap类。在这个类中有大量的静态方法,其中最重要的一个是CurrentNode属性。在网站的任何页面中,你都可以调用SiteMap.CurrentNode来引用与当前的执行页面相匹配的导航数据片断。导航数据是用SiteMapNode实例的形式返回的--当你调用SiteMap.CurrentNode的时候,该属性返回与当前页面对应的SiteMapNode实例。站点导航特性根据存储在XML文件中的导航数据返回正确的节点。

  下面的例子演示了一个带有简单的分页功能的用户控件。在显示的页面中,用户控件位于页面的底部中间。最初该链接的内容是"下一个主题"。当你点击这个链接的时候,用户控件调用SiteMapNode对象来检测当前页面的附近是否存在页面。代码检测SiteMap.CurrentNode属性,看它的前面是否有页面(SiteMap.CurrentNode.PreviousSibling)、它的后面是否有页面(SiteMap.CurrentNode.NextSibling)。如果存在页面,用户控件就显示超链接,并把超链接的NavigateUrl属性设置为附近节点的Url属性。

  如果你点击页面左部的Treeview链接,可以看到用户控件是如何自动地显示适当的"前一个主题"和"后一个主题"链接的。用户控件还显示了另外一个超链接,你可以点击它返回主页。如果你查看这个超链接如何工作就会发现,该控件利用了主页元素中的自定义属性"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>  


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-04  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 4799
  • 日志数: 137
  • 建立时间: 2006-11-01
  • 更新时间: 2008-04-29

RSS订阅

Open Toolbar