ASP.NET 网站导航提供若干 Web 服务器控件用于 Web 页面中导航结构的显示:SiteMapPath
,TreeView
,和 Menu
控件。这些 Web 服务器控件都使用 ASP.NET 默认的网站地图提供者。或是从 XML 格式的 Web.sitemap 文件中读取网站地图信息的 XmlSiteMapProvider
类。
另外,也可以实现自定义网站地图提供者。下面列出创建自定义网站地图提供者的三大理由:
-
需要将不被 ASP.NET 默认网站地图提供者所支持的网站地图信息保存到数据源(比如,某个 Visual FoxPro 数据库,某个 Oracle 数据库,或是其他数据库)。
-
需要使用不同于 Web.sitemap 文件的结构定义来管理导航信息。比如,开发者那里可能有另外一种存储网站地图数据的实现。
-
需要使用动态网站地图结构。比如,需要每个客户端帐号分别查看不同的网站地图。
安全提示:实现自定义网站地图提供者并将网站地图数据保存在非 .sitemap 扩展名的文件中是一个潜在的安全隐患。默认时的 ASP.NET 配置会在客户端下载之前对包含已知文件扩展名(如 .sitemap)的文件进行保护。为了保护网站数据,请把自定义网站地图文件存放在 App_Data 目录下。
必需的类
要想实现网站地图提供者,请先创建继承自 System.Web
命名空间下的 SiteMapProvider
抽象类的自定义类,并且实现由 SiteMapProvider
类所暴露的抽象成员。本文将描述在 SiteMapProvider
抽象类中必须实现的属性和方法。
提示:SiteMapProvider
类对网站地图数据有一个强制性约束:即只允许存在一个根目录。ASP.NET 的默认网站地图提供者中对该约束的实现是:在提供者空间里所指定的 URL 必须是唯一的,但是自定义网站地图提供者时就没有这个限制。
必需的 SiteMapProvider
成员
下表仅列出了自定义网站地图提供者必须要实现的方法列表。其他方法则由 SiteMapProvider
基类提供基本实现。
方法 | 描述 |
---|---|
| 重新获取 |
| 重新获取特定 |
| 重新获取特定 |
| 重新获取由当前提供者所管理的所有节点的根目录。该方法在若干网站导航控件的内部被调用,用于确定导航数据是否已经被提供者装载。且该方法不允许返回空值( |
如果开发者虽然对 XmlSiteMapProvider
的功能感到满意但是还想要使用除 Web.sitemap 文件以外的其他数据存储时,就需要使用 StaticSiteMapProvider
类作为被继承对象,而不是 SiteMapProvider
类。另外,有一些方法(如 AddNode
和 RemoveNode
方法)可能在没有被实现的情况下引发 NotImplementedException
异常。StaticSiteMapProvider
类提供了存储和搜索节点时所需要的所有内部逻辑;所以开发者只需要实现 GetRootNodeCore
方法和抽象的 BuildSiteMap
方法即可。另外,GetRootNodeCore
方法的内部会对 BuildSiteMap
方法进行简单调用。
自定义成员
开发者可能需要为网站地图提供者扩展一些没有被抽象类 SiteMapProvider
所支持的额外功能。如果自定义提供者被配置成默认提供者并且将 Provider
属性返回值的类型强制转换成自定义提供者类型时,任何被添加在自定义网站地图提供者中的公共成员都可以通过 SiteMap
类的 Provider
属性进行访问。