16.2 理解站点地图
如果网站有很多个功能页面,为了使用户能够快速定位到所需要的页面,需要把网站的众多页面按照其功能分成许多导航链接菜单,并且这些菜单之间有时候会根据其功能层次进行很深的嵌套,如图16-8所示。有了这些导航菜单,用户就可以快速定位到所需要的功能页面。
图 16-8 微软官方网站的站点地图
然而,要在ASP.NET Web页面中实现如图16-8所示的导航菜单,如果使用HTML的链接标签或者其他ASP.NET服务器控件来解决这样的问题,那将是一件吃力不讨好的事。而面对这样的问题,ASP.NET的站点导航功能为我们提供了很好的解决方案,使用它们来建立站点导航系统可以大大简化你的工作。
ASP. NET站点导航是能够为用户提供一致的站点导航方式的一组类。随着站点内容的增加以及在站点内来回移动网页,管理所有的页面链接很快会变得非常困难。ASP.NET站点导航技术使你能够将页面的所有链接存储在一个中心位置,并通过包含一个用于读取站点信息的SiteMapDataSource控件以及用于显示站点信息的导航Web服务器控件(如TreeView或Menu控件)在每个页面上的列表或导航菜单中呈现这些链接,如图16-9所示。
如图16-9所示,ASP.NET站点导航主要由与站点地图数据源通信的站点地图提供程序以及公开站点地图提供程序的功能的类构成。简单地讲,它包含以下三个部分:
1)定义站点导航结构的方式。这部分是XML站点地图,它(默认)保存在文件里。
2)解析站点地图文件,并把它的信息转换为适当对象模型的便捷方式。这部分工作由SiteMapDataSource和XmlSiteMapProvider实现。
3)利用站点地图信息显示用户当前位置,并让用户能够方便地从一个页面跳转到另一个页面的简单方法。这部分由绑定到SiteMapDataSource控件的控件提供,可以是浏览路径链接、列表、菜单或者树。
图 16-9 使用站点地图的ASP.NET导航
16.2.1 Web.sitemap文件
如图16-9所示,创建站点地图最简单的方法是创建一个名为Web.sitemap的XML文件,该文件按站点的分层形式组织页面。ASP.NET的默认站点地图提供程序会自动选取此站点地图。尽管Web.sitemap文件可以引用其他站点地图提供程序或其他目录中的其他站点地图文件以及同一应用程序中的其他站点地图文件,但该文件必须位于应用程序的根目录中。
Web. sitemap文件的创建方法很简单,用鼠标右击项目,选择“Add”|“New Item”命令,在弹出的“Add New Item”对话框中选择“Site Map”模板,在Name文本框中添加地图名称Web.sitemap之后,单击“Add”按钮就可以在应用程序的根目录中创建一个Web.sitemap文件了。打开Web.sitemap文件,结构如下面的代码所示:
<?xml version="1.0"encoding="utf-8"?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode url=""title=""description="">
<siteMapNode url=""title=""description=""/>
<siteMapNode url=""title=""description=""/>
</siteMapNode>
</siteMap>
如上面的代码所示,为了保证Web.sitemap文件的有效性,Web.sitemap文件必须以<siteMap>节点开始,后面跟一个<siteMapNode>元素,它代表默认主页。可以在根<siteMapNode>内嵌入无限多层<siteMapNode>元素,每个<siteMapNode>元素代表一个页面。
在Web.sitemap文件中,无论哪一级别的<siteMapNode>元素,它都必须有标题((ttle)、描述((dscription)以及URL(url)这三个属性。如下所示:
<siteMapNode title="主页"description="网站主页"url="~/default.aspx">
代码清单16-3演示了一个简单的站点地图文件结构。
代码清单16-3 Web.sitemap
<?xml version="1.0"encoding="utf-8"?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode title="主页"description="网站主页"url="~/Default.aspx">
<siteMapNode title="产品信息"description="产品信息列表"
url="~/Products.aspx">
<siteMapNode title="硬件"description="硬件信息"
url="~/Hardware.aspx">
<siteMapNode title="处理器"description="处理器信息"
url="~/Cpu.aspx"/>
<siteMapNode title="内存"description="内存信息"
url="~/Memory.aspx"/>
</siteMapNode>
<siteMapNode title="软件"description="软件信息"
url="~/Software.aspx">
<siteMapNode title="Windows"description="Windows"
url="~/Windows.aspx"/>
<siteMapNode title="Office"description="Office"
url="~/Office.aspx"/>
</siteMapNode>
</siteMapNode>
<siteMapNode title="技术支持"description="技术支持"
url="~/Services.aspx">
<siteMapNode title="产品服务"description="产品服务"
url="~/ProductService.aspx"/>
<siteMapNode title="投诉建议"description="投诉建议"
url="~/Advice.aspx"/>
</siteMapNode>
</siteMapNode>
</siteMap>
在代码清单16-3中,所有的节点都有URL链接信息,即它们都是可单击的,通过单击链接信息,可把用户带到特定的页面。不过,有时希望让某些节点只是作为组织其他链接的类别,这时可以通过忽略url特性来达到这个要求。这样,在绑定控件里还可以看到这个节点,但它们不会呈现为链接。
最后,在建立站点地图文件时,还需要注意如下事项:
1)建议URL使用“~/”的路径结构,它表示Web应用程序的根。
2)不能为同一个URL创建两个站点地图节点。
需要说明的是,不能出现重复URL并不是导航系统所固有的。它只是XmlSiteMapProvider的要求,因为XmlSiteMapProvider把URL作为唯一键。如果创建自己的站点地图提供程序或者使用第三方的提供程序,就可以允许重复的URL但需要唯一的键值信息。不过不能打破每个站点必须有一个根节点的限制,因为它由SiteMapProvider基类实现。
16.2.2 配置多个站点地图
默认情况下,ASP.NET网站导航使用一个名为Web.sitemap的XML文件,该文件用于描述网站的层次结构。但是,有时可能需要使用多个站点地图文件来描述整个网站的导航结构。若要为一个网站配置多个站点地图,请从应用程序根目录下的站点地图开始,即Web.sitemap文件。然后通过在SiteMapNode对象中引用子站点地图来链接到它们,如图16-10所示。
图 16-10 使用站点地图的ASP.NET导航
图16-10包含了两个站点地图文件:Web.sitemap文件和Service.sitemap文件。为了使网站能够显示这两个站点地图文件,需要在父站点地图的导航结构中,在要显示子站点地图的位置创建一个SiteMapNode,如代码清单16-4所示。
代码清单16-4 Web.sitemap
<?xml version="1.0"encoding="utf-8"?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode title="主页"description="网站主页"url="~/Default.aspx">
<siteMapNode title="产品信息"description="产品信息列表"
url="~/Products.aspx">
<siteMapNode title="硬件"description="硬件信息"
url="~/Hardware.aspx">
<siteMapNode title="处理器"description="处理器信息"
url="~/Cpu.aspx"/>
<siteMapNode title="内存"description="内存信息"
url="~/Memory.aspx"/>
</siteMapNode>
<siteMapNode title="软件"description="软件信息"
url="~/Software.aspx">
<siteMapNode title="Windows"description="Windows"
url="~/Windows.aspx"/>
<siteMapNode title="Office"description="Office"
url="~/Office.aspx"/>
</siteMapNode>
</siteMapNode>
<siteMapNode siteMapFile="~/SiteMap/Service.sitemap"/>
</siteMapNode>
</siteMap>
在代码清单16-4中,通过语句<siteMapNode siteMapFile="~/SiteMap/Service.sitemap"/>来引用子站点地图Service.sitemap文件。在这里需要注意的是,当指定siteMapFile属性时,就不要为siteMapNode元素提供Url、title或description属性。
其中,siteMapFile属性可以采取下面的某一种形式:
1)一个与应用程序相关的引用,如“~/SiteMap/Service.sitemap”。
2)一个虚拟路径,如“/SiteMap/Service.sitemap”。
3)一个相对于当前站点地图文件位置的路径引用,如“SiteMap/Service.sitemap”。
子站点地图文件Service.sitemap如代码清单16-5所示。
代码清单16-5 Service.sitemap
<?xml version="1.0"encoding="utf-8"?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode title="技术支持"description="技术支持"
url="~/Services.aspx">
<siteMapNode title="产品服务"description="产品服务"
url="~/ProductService.aspx"/>
<siteMapNode title="投诉建议"description="投诉建议"
url="~/Advice.aspx"/>
</siteMapNode>
</siteMap>