ASP.NET 2.0站点导航功能之建立导航2010-12-08 天极 朱先忠一、简介任何由多个页面组成的网站都需要某种导航用户接口。一个导航用户接口可 能象一些该站点中的到另外一些页面的静态超级链接一样得简单,或者可能包含 菜单或树形控件的使用。但是,在为该站点创建一个导航用户接口之前,首先必 须定义站点的逻辑结构。(这个逻辑结构常常被参照为一个站点地图。)例如,一 个象Amazon.com这样的网站被组织成各个部分-其中包括产品栏如电子学书,计 算机书,DVD等等。其中的每个还可能含有子部分。书目按类型划分,象CD,小 说,历史书,浪漫书类,等等。典型地,这些逻辑结构形成一个分类层次。在下 面的屏幕快照显示出Amazon.com的站点地图的缩略版本。

一旦定义了站点地图,就可以创建站点的导航用户接口。在Amazon.com站点 ,主页面在页面左边列出到各个分部分的超级链接。进入到一特定部分之后,在 左边将显示该部分的子部分信息。然而,也可以使用另外的导航用户接口:你可 能有一个树来显示各个部分和子部分,或用一个菜单作顶级菜单项来列举如书籍 ,电子产品,DVD,等等;而每个菜单项的子菜单又包含各个部分的子部分。在ASP.NET 2.0以前,开发者典型地自己解决他们的站点导航功能.然而, ASP.NET 2.0使得定义一站点的结构并且使用普通导航用户接口元素实现它轻松 极了。在本文中,我们将分析一下ASP.NET 2.0的站点导航特征。二、ASP.NET 1.x时代的站点导航ASP.NET 版本1.x确实没有提供任何内置的站点导航支持;因此,大多数开发 者实现他们自己的站点导航功能。在创建他们自己的站点导航功能时,开发者面 临两个挑战:1. 决定怎样把站点的结构信息串行化到一张站点地图中 2. 实现导航用户接口元素为解决第一个问题,开发者们需要决定如何建模该站点的结构。要把这些信 息放置到一个XML文件呢?还是添加一数据库表来存储站点的各个部分及其联系 方式?对于支持用户帐户的站点,可能有只对属于特别角色的用户是可存取的部 分。而且,支持多种语言的站点某种程度上都需要提供针对各个站点部分的翻译 。在决定需要存储什么信息来描述站点的结构以及这些信息怎样被串行化(数据 库?XML文件?另外的东西?)以后,开发者还要面对第二个挑战-怎样向用户显示这 个站点的结构。一个常用的导航用户接口元素是菜单;然而,ASP.NET 1.x中并 没有提供内置的菜单Web控件-这意味着开发者要自己花钱购买或自己构建。让我们总结一下,在ASP.NET版本1.x中实现站点导航并不是多么困难的任务 ;但是,这是必须要做的另外一个任务。而且,既然没有站点导航的内置支持, 每个开发者可能会找到他自己的独特方法,这提高了开发新手学习曲线的陡峭程 度-他们必须学习定制站点导航逻辑。三、ASP.NET 2.0中的站点导航在ASP.NET 2.0中实现站点导航轻而易举,这归功于构建站点导航特征。内部 地,ASP.NET提供了一组可编程API-用它可以进行站点地图查询。ASP.NET不需要 为指定站点地图而提供特殊格式,尽管它确实提供了一种使用XML格式文件的缺 省选择。关于怎样串行化站点地图的细节是可以被定制的,因为ASP.NET 2.0的 站点导航特征使用一种提供者模型。该提供者模型使开发者能够定制一个特定 ASP.NET分系统的内部实现-只要它们保持向前引用的API是相同的。简言之,你可以使用ASP.NET 2.0的缺省的基于XML的方法来指定你的网站的 站点地图,或仅加上一点编码,你就能使用现有的定制方法,或其它一些方法。 (本文将讨论使用缺省的技术(基于XML和站点地图);本系统的后一篇文章将分析 怎样定制站点导航提供者。)除了提供一种可定制的手段来指定站点结构外,随同ASP.NET 2.0一起发行的 还有一些导航Web控件-它们使得显示站点地图就象拖放一个控件到你的ASP.NET 页面一样容易:1. SiteMapPath-显示一个breadcrumb,用于显示终端用户处于相对于站点结 构的具体位置。例如,在访问Amazon.com站点的Novels部分时,一个breadcrumb 显示可能是这个样子:Home>Books>Novels。2. TreeView-用一个可展开的树显示站点的结构。3. Menu-使用一菜单显示站点的结构。4. 在显示站点导航时,TreeView控件和Menu控件都使用SiteMapDataSource 控件来读取站点地图的内容。在底层实现上,这些控件调用了ASP.NET 2.0的站点导航API。既然该站点导 航部分是用提供者模型来实现的,那么,该控件在怎样串行化站点地图的内部实 现原理是易于理解的。也就是说,不管你是否使用缺省的站点地图或滚动你自己 定制的站点地图逻辑,导航控件都可以用于同你的站点地图一道工作。(假定, 如果你想使用一个定制的站点地图,那么你确实需要创建一个类-它提供所想要 的方法和属性以与站点地图一起工作;更细致的讨论见下一篇文章)。