0

0

十分钟内学会:根据数据库生成站点导航

php中文网

php中文网

发布时间:2016-06-07 14:59:47

|

1413人浏览过

|

来源于php中文网

原创

Question 上次的《十分钟内学会:存储在二维表的树结构如何进行指定深度节点的查询》提到用树结构表示无限分级的商品分类或论坛板块,也就是说这种树结构常常用于存储与导航相关的信息,该如何让网站导航自动按照数据库中存储的树结构自动生成呢? Answer 继

Question

上次的《十分钟内学会:存储在二维表的树结构如何进行指定深度节点的查询》提到用树结构表示无限分级的商品分类或论坛板块,也就是说这种树结构常常用于存储与导航相关的信息,该如何让网站导航自动按照数据库中存储的树结构自动生成呢?

Answer

继承自SiteMapProvider

要实现站点导航,在ASP.NET 2.0中最方便的就是SiteMap功能了。如果仅仅使用XmlSiteMapProvider则只能从静态的sitemap文件中影射出导航来,无法反映数据库中存储的导航结构。如果要实现根据数据库生成站点导航,就要开发自己的SiteMapProvider。

SiteMapProvider有4个方法要重写,分别是FindSiteMapNode(根据URL获取节点)、GetChildNodes(获取所有子节点)、GetParentNode(获取父节点)、GetRootNodeCore(获取本SiteMapProvider管理范围内的根节点)。对于SiteMap的使用方来说,例如SiteMapDataSource,通过上述4个方法总能在有限步骤内完成SiteMap相关的查询,例如展开若干层SiteMap,以及获取根SiteMapNode到特定SiteMapNode的路径。所以你只要确保自己的SiteMapProvider类正确实现上述4个方法,就可以用于任何SiteMap查询。

SiteMapProvider的灵活性是非常高的,特能构造严格的树,甚至是有向图,例如一个节点只能有一个父节点,但它却可以是多个节点的子节点。这看上去不那么容易理解,但你确实可以这样做,因为SiteMapProvider可以设计为在多个不同的节点输入到GetChildNodes方法时返回的列表都包含同一个特定的节点。如果你觉得你不需要这种灵活性,而需要使用严格的树,并且树是相对静态的(也就是一次构造树就可以用于多次查询),那就应该考虑继承自StaticSiteMapProvider而不是SiteMapProvider。

继承自StaticSiteMapProvider

实现StaticSiteMapProvider的方式与实现SiteMapProvider的方式是不同的。如果你选择了继承自StaticSiteMapProvider,你就相当于确定了导航模型是严格的树。你只需要负责从持久数据中将树结构描述出来,而StaticSiteMapProvider的基础功能会帮你维护树结构在内存中的副本,并由此而提供上述4个要重写的方法中的3个,只剩下GetRootNodeCore需要由你自己重写。

继承自StaticSiteMapProvider的话,除了GetRootNodeCore需要重写以外,还需要重写BuildSiteMap方法,这个正是StaticSiteMapProvider构建内存中树结构的地方。构建操作所需要的方法也由StaticSiteMapProvider提供了,分别是AddNode和RemoveNode方法,另外还有一个Clear方法可以清空内存中的整个树结构。

结合数据库

一般通过数据库构造SiteMap,需要重写StaticSiteMapProvider的Initialize、GetRootNodeCore和BuildSiteMap方法。

Initialize方法继承自ProviderBase,这是一个所有Provider类的基类。在Initialize方法中你能接收到此Provider的名称与配置信息。你可以将ConnectionString写在此Provider在web.config中的配置节,在Initialize时这些配置键值就会传入,你可以在此时将传入的ConnectionString保存到Provider的私有变量中,但不要在Initialize中构造树,因为它仅仅会被调用一次。

Civitai
Civitai

AI艺术分享平台!海量SD资源和开源模型。

下载

GetRootNodeCore用于返回此SiteMapProvider责任范围内的根节点。因为整个SiteMap可以由多个SiteMapProvider提供的SiteMap构成,在跨越SiteMapProvider责任范围边界时,范围内的根节点就关键的标记。通常的做法是,在实现自己的StaticSiteMapProvider时使用一个私有变量保存代表根节点的那个SiteMapNode,而这个SiteMapNode由BuildSiteMap负责构建。

BuildSiteMap是StaticSiteMapProvider派生类的核心,在这里你需要调用Clear方法清空原来的树,然后查询数据库并利用AddNode和RemoveNode方法构建新的树。需要注意的是,此方法必须是线程安全的,因为可能多个客户端访问页面而导致同时向你的StaticSiteMapProvider查询数据,于是多个线程同时调用BuildSiteMap方法。所以重写的BuildSiteMap方法中,通常一开头进行Clear之后就是lock(this),然后再开始构建树。

注意事项

SiteMapProvider和StaticSiteMapProvider的其他方法你喜欢的话也可以去重写,记得要确保线程安全就是了。StaticSiteMapProvider自带的方法都是线程安全的,如果直接调用的话则可依赖其内部的lock而无需自己lock。

如果你的SiteMapProvider要作为XmlSiteMapProvider的下一级SiteMapProvider,则通过在静态sitemap文件中声明来配置。如果你的SiteMapProvider中还要引用另外一个SiteMapProvider,那么父SiteMapProvider仅需要在自己提供的SiteMap中包含下一级SiteMap的根节点,这通常可以通过下一级的SiteMapProvider.GetRootNodeCore方法获取,同时设置子SiteMapProvider的ParentProvider属性为父SiteMapProvider,这就行了。

最后,如果你觉得本系列的文章对你有价值,可以考虑订阅Cat in dotNET,或者通过文章下方的书签服务按钮将本文推荐给更多人看。

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
TypeScript-45分钟入门
TypeScript-45分钟入门

共6课时 | 0.4万人学习

第二十四期_前端开发
第二十四期_前端开发

共161课时 | 4.3万人学习

10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号