剖析ASP.NET2.0导航功能之控制地图信息

asp.net|控制

      一、 简介

  任何由多个页面组成的网站都需要某种导航用户接口,这是用两步来创建的。首先,必须定义站点的逻辑结构;然后,添加用户接口元素来允许用户在站点结构的各个部分之间来回移动。在ASP.NET 2.0以前,要求开发者自己来解决这两个问题。然而,到了版本2.0以后,ASP.NET提供了一个简单的方法来定义一站点的结构并且包括大量的Web控件-专门设计来显示站点导航用户接口。

  在上一篇中我们分析了怎样通过导航Web控件来创建Web.sitemap XML站点地图文件以及怎样显示站点导航信息,这包括:

  ·SiteMapPath,它显示一个breadcrumb(Home>Electronics>XBOX)

  ·TreeView,它显示一个可折迭的垂直显示的树,用于显示整个站点地图层次

  ·Menu,它显示一个水平或垂直对齐的菜单

  上一篇中只对站点地图文件和导航Web控件的功能和能力提供了一个粗略介绍。在这一部分里,我们将把注意力转到编程地控制站点地图信息,并详细地分析一下SiteMapPath导航Web控件。

  二、 站点地图

  本文中的示例使用在第一部分中创建的站点地图。你可以在第一部分看到该站点地图XML文件的精确的句法或在本文最后下载下来。站点结构的图形化表示使用于这些示例中,见下图:


  三、 编程控制站点地图

  一个站点地图是一个相关联的站点地图结点的集合。典型地,每个站点地图结点包含一标题,一个URL和一个描述。上面显示的图像是站点地图的一个示例,其中每个矩形代表一个站点地图结点。ASP.NET并不要求一特别的格式来指定站点地图,尽管它的确提供了使用一XML格式文件的默认选择。(关于XML文件的细节请参考第一篇)

  ASP.NET提供了一个类称为SiteMap-它提供只读的,编程地存取该站点地图。这个类被两个控件内部使用,在本文的后面我们将分析这两个类:

  ·SiteMapPath-基于被访问页面和它的站点结构位置生成一个breadcrumb。具体地说,该SiteMapPath从由SiteMap.CurrentNode属性返回的结点开始,往上遍历这个层次结构直到根部。

  ·SiteMapDataSource-这个控件创建一个层次结构的数据源-它映射该站点地图的结构。为了在另外的Web控件中显示站点地图信息,例如TreeView或Menu,该Web控件并不直接查询站点地图;而是,它们绑定到一个SiteMapDataSource控件-它负责读取该站点地图结构。

  SiteMap类有两个属性:RootNode和CurrentNode。这两个属性都返回SiteMapNode实例。SiteMapNode类代表一个定义在站点地图中的结点并且具有描述该结点的属性-Title,Url和Description,另外还有通过编程方式控制层次结构的属性-ParentNode,ChildNodes,NextSibling,PreviousSibling,等等。

  你可以在你的自己ASP.NET页中使用SiteMap类。例如,我们能在每个页面中显示Next,Previous和Up链接-这只需通过添加三个HyperLink控件到站点的主页面,另加上一点点编程以检查是否CurrentNode有一NextSibling,PreviousSibling或ParentNode。具体地说,你将添加下列标记到你的主页面:

[<asp:HyperLink ID="lnkPrev" runat="server">Prev</asp:HyperLink>] |
[<asp:HyperLink ID="lnkUp" runat="server">Up</asp:HyperLink>] |
[<asp:HyperLink ID="lnkNext" runat="server">Next</asp:HyperLink>]

  主页面的Page_Load事件处理器看上去如下:

If SiteMap.CurrentNode IsNot Nothing Then
 '设置next/previous/up链接
 If SiteMap.CurrentNode.PreviousSibling IsNot Nothing Then
  lnkPrev.NavigateUrl = SiteMap.CurrentNode.PreviousSibling.Url
  lnkPrev.Text = "< Prev (" & SiteMap.CurrentNode.PreviousSibling.Title & ")"
 Else
  lnkPrev.NavigateUrl = String.Empty
  lnkPrev.Text = "< Prev"
 End If
 If SiteMap.CurrentNode.ParentNode IsNot Nothing Then
  lnkUp.NavigateUrl = SiteMap.CurrentNode.ParentNode.Url
  lnkUp.Text = "Up (" & SiteMap.CurrentNode.ParentNode.Title & ")"
 Else
  lnkUp.NavigateUrl = String.Empty
  lnkUp.Text = "Up"
 End If
 If SiteMap.CurrentNode.NextSibling IsNot Nothing Then
  lnkNext.NavigateUrl = SiteMap.CurrentNode.NextSibling.Url
  lnkNext.Text = "(" & SiteMap.CurrentNode.NextSibling.Title & ") Next >"
 Else
  lnkNext.NavigateUrl = String.Empty
  lnkNext.Text = "Next >"
 End If
End If

  这将把三个超级链接Next,Up和Previous添加到从主页面继承的每一个页面,参见下图的快照。

  需要完成这一功能的标记和代码见于本文所附源码中。

  四、 用SiteMapPath控件显示Breadcrumbs

  SiteMapPath控件显示一个breadcrumb-它用于向用户显示他们在该站点结构中所处的位置。SiteMapPath控件的输出由下列三个因素决定:

  ·站点的结构,由站点地图定义,

  ·被访问的页面和

  ·SiteMapPath控件的属性值

  当访问一个有SiteMapPath控件的页面时,该SiteMapPath控件试图把页面的URL映射到定义在该站点地图中的一个站点地图结点的url值。如果找到一个匹配,该控件将上行遍历该结构到根部,并作下列输出:RootNode>ParentNode>...>ParentNode>CurrentNode。这里的CurrentNode是站点地图结点的标题-它用来映射当前页面请求的URL;RootNode和ParentNodes被作为超级链接生成,如果该站点地图结点有一个定义在该站点地图中的URL值。在"History Books"页面(Books/History.aspx)中的一个SiteMapPath控件将生成Home>Books>History,同时还分别生成超级链接形式的Home和Books,分别回指向Default.aspx和Books/Default.aspx。在访问Books/Default.aspx时,SiteMapPath生成Home>Books。

  非常清楚,SiteMapPath的输出既依赖于站点地图本身又依赖于正在被访问的页面。该SiteMapPath的输出可以被定制,通过该控件的属性。有一些标准Web控件格式的属性-BackColor,Font,ForeColor,等等-还有一些特定于SiteMapPath的设置,包括:

  u PathDirection-可以取两个值之一它们是RootToCurrent(缺省的)或CurrentToRoot。当取值为RootToCurrent,在"History Books"页面上的breadcrumb生成为Home>Books>History;当取值为CurrentToRoot,输出将是History>Books>Home。

  ·PathSeparator-指定用于分开breadcrumb中的每个结点的字符串;缺省为>

  ·RenderCurrentNodeAsLink-一个Boolean属性-它指定是否CurrentNode应该生成为一个链接;缺省为False。

  ·ParentLevelsDisplayed-一个整数值-它可以用于限制breadcrumb所显示树层结构的高度。缺省地,这个属性值是-1,这意味着没有限制;把它的值置为1,那么在"History Books"页面将生成breadcrumb Books>History。根不包含在内,因为SiteMapPath控件只是向上遍历到一个父级-从"History"到"Book"。

  ·ShowToolTips-如果一站点地图结点有一个描述值,那么该描述对于每一个breadcrumb结点被显示为一个提示文本,如果这个属性被设置为True(默认情况)。

  还有风格属性可用来设置BackColor,Font,ForeColor,等等-用于SiteMapPath控件的各个部分。可以使用NodeStyle属性来定制在breadcrumb中的结点的外观;可以使用RootNodeStyle和CurrentNodeStyle来进一步定制在breadcrumb中的第一个和最后一个结点。一般地,最简单也是最具有审美特点的来格式化该SiteMapPath控件的方法是使用它的"Auto Format"向导-这可以通过该控件的灵敏标签启动。

  五、 用模板定制生成的输出

  该SiteMapPath包含四个模板-它们允许进一步定制生成的输出。模板允许混合使用静态HTML标记,Web控件和数据绑定语法;如果你以前已使用了DataList或Repeater控件,那么你已对模板很熟悉了。在ASP.NET 2.0中的模板基本上同ASP.NET 1.x中的一样,除了ASP.NET 2.0引入了一些新的更精练的语法来数据绑定表达式外。例如,在ASP.NET 1.x中,你必须使用语法<%# DataBinder.Eval(Container.DataItem, PropertyName) %>来取得一列的值。而在ASP.NET 2.0中,这种老式的语法仍可以使用,但是你可以选择性地使用更短的版本<%# Eval(PropertyName) %>。

  默认地,SiteMapPath以常规超级链接方式生成根和父结点,这样当用户点击该链接时,他们可以在该控件层次树上快速地向上回退。然而,在把信息发送回用户前,你可能想做一些服务器端处理-也许你想要记录下用户要到哪里去或自动地保存他们在该页面所做的任何变化。可以通过使用一个模板和把该结点生成为一个LinkButton来实现这一功能。

  例如,如果你只想要把SiteMapPath的根结点生成为一个LinkButton,你可以用下面的标记来把一个<RootNodeTemplate>添加到SiteMapPath控件上:

<asp:SiteMapPath ID="SiteMapPath1" runat="server">
<RootNodeTemplate>
<asp:LinkButton ID="LinkButton1" runat="server"
Text='<%# Eval("title") %>'
CommandArgument='<%# Eval("url") %>'
OnCommand="LinkButton1_Command">
</asp:LinkButton>
</RootNodeTemplate>
</asp:SiteMapPath>

  这个标记添加一LinkButton控件到SiteMapPath-它的Text属性被分配给相应SiteMapNode的Title属性。当点击该LinkButton时,将导致一个回寄并且该控件的Command事件激发-这将激活LinkButton1_Command事件处理器。SiteMapNode的Url属性被通过CommandArgument属性传递到这个事件处理器。在这个事件处理器中,你可以做任何服务器端所需要的处理,然后通过Response.Redirect(e.CommandArgument)把用户引导到他们所请求的页面上去。

时间: 2024-12-22 00:36:30

剖析ASP.NET2.0导航功能之控制地图信息的相关文章

ASP.NET 2.0导航功能之控制地图信息

一.简介 任何由多个页面组成的网站都需要某种导航用户接口,这是用两步来创建的 .首先,必须定义站点的逻辑结构:然后,添加用户接口元素来允许用户在站点 结构的各个部分之间来回移动.在ASP.NET 2.0以前,要求开发者自己来解决这 两个问题.然而,到了版本2.0以后,ASP.NET提供了一个简单的方法来定义一站 点的结构并且包括大量的Web控件-专门设计来显示站点导航用户接口. 在上一篇中我们分析了怎样通过导航Web控件来创建Web.sitemap XML站点地 图文件以及怎样显示站点导航信息,

ASP.NET2.0导航功能之配置会员和角色

asp.net     在本文中,我们将主要探讨ASP.NET 2.0的会员.角色和配置问题 一. 简介 在本文中,我们将主要探讨ASP.NET 2.0的会员.角色和配置问题.ASP.NET中的会员系统提供了一个可编程API用于创建和管理用户账户,而其中的角色部分使开发者能够定义一组角色并把用户与角色相关联.典型地,一个提供用户账户的网站都具有只为某些用户.认证用户或属于特定角色的用户所存取的内容部分. 例如,一个Web站点可能有一组页面-它允许一个信任用户编辑该Web站点的内容或管理已有用户.

基于ASP.NET2.0的非HttpModule山寨版MVC框架的实现

在ASP.Net MVC框架中是使用地址拦截的,虽然很好用,但是装起来太大了,配置也麻烦.本文通过代码实践,在ASP.Net2.0框架下实现一套简易的MVC框架.MVC框架难于构建的地方在于Controller与View的分离以及分离后数据可以方便地传输.为了保持代码的简洁,将使用ashx文件作为Controller,用aspx页面作为View. 讲起来比较费劲,把项目文件放上来,而下面只作一个简单的说明.项目是VS2008的项目,大小15K. 下载地址:DotNetMVC.rar 首先构建一个

ASP.NET2.0 HiddenField控件

asp.net|控件    HiddenField控件顾名思义就是隐藏输入框的服务器控件,它能让你保存那些不需要显示在页面上的且对安全性要求不高的数据.也许这个时候应该有这么一个疑问,为什么有了ViewState.Session和Cookie等状态保存机制,还需要用起HiddenField呢?增加HiddenField,其实是为了让整个状态管理机制的应用程度更加全面.因为不管是ViewState.Cookie还是Session,都有其失效的时候,比如用户因某种需求要求设置ViewState为fa

ASP.NET2.0的控件状态和视图状态探讨

asp.net|控件|视图 基本概念 控件状态-为了让控件正常工作,有时需要存储控件状态数据.例如,如果编写了一个自定义控件,其中具有显示不同信息的不同选项卡,为使该控件如预期一样工作,控件需要知道在往返过程中选择的是哪个选项卡.ViewState 属性可用于此目的,但开发人员可能在页级别关闭了视图状态,从而有效地中断控件.为解决此问题,ASP.NET 页框架在 ASP.NET 2.0 版中公开了一种称为控件状态的新功能. ControlState 属性允许保持特定于控件的属性信息,不像 Vie

ASP.NET2.0实现网站的自动升级

asp.net 网站的自动升级主要是要实现从一台服务器上下载某些文件到本服务器上,然后对下载下来的文件进行更新等操作. 比如,现在有服务器A,服务器B和客户端C. 作为COM公司开发的产品DIV网站系统被安装到服务器B上,而它的更新设置及更新文件则在服务器A上.当客户C访问服务器B的网站时,B从A上下载更新文件,然后进行更新操作. 其中虽然第四步最重要,是逻辑的核心,但是下载什么文件,怎么下载也捆饶着我们. 这里介绍的ASP.NET2.0是VB.NET.VB.NET 引入了一个新的命名空间 --

ASP.NET2.0数据操作之母板页和站点导航

asp.net|导航|数据|站点 导言 通常,用户友好的个性化站点都有着一致的,站点统一的页面布局和导航体系.Asp.net 2.0引入的两个新特性给我们在统一站点的页面布局和站点导航上提供了简单而有效的工具,它们是母板页和站点导航.母板页允许开发者创建统一的站点模板和指定的可编辑区域.这样,aspx页面只需要给模板页中指定的可编辑区域提供填充内容就可以了,所有在母板页中定义的其他标记将出现在所有使用了该母板页的aspx页面中.这种模式允许开发者可以统一的管理和定义站点的页面布局,因此可以容易的

ASP.NET2.0应用的全球化与本地化之本地化

asp.net 摘要:本文将通过一个实际案例来详细剖析如何实现一个ASP.NET 2.0网站开发过程中的全球化与本地化问题. 一.简介 全球化和本地化是每一位开发者在创建全球化产品或应用程序时必须清楚的两个重要的慨念.尽管有许多文章对这个题目作过较好的解释,但是我一直没有看到一篇全面而综合地讨论关于全球化/本地化的所有重要概念的文章.本文旨在通过一个具体案例来详细分析使用ASP.NET2.0开发一个web应用程序时所涉及到的全球化问题. 二.背景理论 全球化是应用程序开发中某一阶段的任务,其目的

原创:在ASP.NET2.0中实现主页嵌套

asp.net|原创 现在的很多商业公司都设有不同的部门,而这些部门在公司的网站上都有自己的子网站.一般情况下,每一个部门都会根据自己的需要来维护各自的网站.这样做虽然会使公司的网站显得丰富多彩,但这却会对用户的访问带来不便,也就是说,由于各个部门的子网站没有保持一致性而使用户在浏览网站时造成了困难.幸运的是,ASP.NET2.0为我们提供了一种解决方案,这就是主页嵌套. <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com: