任何由多个页面组成的网站都需要某种导航用户接口。一个导航用户接口可能象一些该站点中的到另外一些页面的静态超级链接一样得简单,或者可能包含菜单或树形控件的使用。
一、 简介
任何由多个页面组成的网站都需要某种导航用户接口。一个导航用户接口可能象一些该站点中的到另外一些页面的静态超级链接一样得简单,或者可能包含菜单或树形控件的使用。但是,在为该站点创建一个导航用户接口之前,首先必须定义站点的逻辑结构。(这个逻辑结构常常被参照为一个站点地图。)例如,一个象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。既然该站点导航部分是用提供者模型来实现的,那么,该控件在怎样串行化站点地图的内部实现原理是易于理解的。也就是说,不管你是否使用缺省的站点地图或滚动你自己定制的站点地图逻辑,导航控件都可以用于同你的站点地图一道工作。(假定,如果你想使用一个定制的站点地图,那么你确实需要创建一个类-它提供所想要的方法和属性以与站点地图一起工作;更细致的讨论见下一篇文章)。