实现 ASP.NET 网站地图提供者

ASP.NET 网站导航提供若干 Web 服务器控件用于 Web 页面中导航结构的显示:SiteMapPathTreeView,和 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 基类提供基本实现。

方法 描述

FindSiteMapNode

重新获取 SiteMapNode 类的实例,从而重新呈现页面。该方法已经被重载。

GetChildNodes

重新获取特定 SiteMapNode 类实例中的子节点集。

GetParentNode

重新获取特定 SiteMapNode 类实例中的父节点。

GetRootNodeCore

重新获取由当前提供者所管理的所有节点的根目录。该方法在若干网站导航控件的内部被调用,用于确定导航数据是否已经被提供者装载。且该方法不允许返回空值(null)。

如果开发者虽然对 XmlSiteMapProvider 的功能感到满意但是还想要使用除 Web.sitemap 文件以外的其他数据存储时,就需要使用 StaticSiteMapProvider 类作为被继承对象,而不是 SiteMapProvider 类。另外,有一些方法(如 AddNodeRemoveNode 方法)可能在没有被实现的情况下引发 NotImplementedException 异常。StaticSiteMapProvider 类提供了存储和搜索节点时所需要的所有内部逻辑;所以开发者只需要实现 GetRootNodeCore 方法和抽象的 BuildSiteMap 方法即可。另外,GetRootNodeCore 方法的内部会对 BuildSiteMap 方法进行简单调用。

自定义成员

开发者可能需要为网站地图提供者扩展一些没有被抽象类 SiteMapProvider 所支持的额外功能。如果自定义提供者被配置成默认提供者并且将 Provider 属性返回值的类型强制转换成自定义提供者类型时,任何被添加在自定义网站地图提供者中的公共成员都可以通过 SiteMap 类的 Provider 属性进行访问。

你可能感兴趣的:(asp.net)