十分钟内学会:根据数据库生成站点导航
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中构造树,因为它仅仅会被调用一次。
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文件中声明
最后,如果你觉得本系列的文章对你有价值,可以考虑订阅Cat in dotNET,或者通过文章下方的书签服务按钮将本文推荐给更多人看。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Go語言是一種高效、簡潔且易於學習的程式語言,因其在並發程式設計和網路程式設計方面的優勢而備受開發者青睞。在實際開發中,資料庫操作是不可或缺的一部分,本文將介紹如何使用Go語言實作資料庫的增刪改查操作。在Go語言中,我們通常會使用第三方函式庫來操作資料庫,例如常用的sql套件、gorm等。這裡以sql包為例介紹如何實作資料庫的增刪改查操作。假設我們使用的是MySQL資料庫。

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

Hibernate多態映射可映射繼承類別到資料庫,提供以下映射類型:joined-subclass:為子類別建立單獨表,包含父類別所有欄位。 table-per-class:為子類別建立單獨資料表,僅包含子類別特有列。 union-subclass:類似joined-subclass,但父類別表聯合所有子類別列。

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

HTML無法直接讀取資料庫,但可以透過JavaScript和AJAX實作。其步驟包括建立資料庫連線、發送查詢、處理回應和更新頁面。本文提供了利用JavaScript、AJAX和PHP來從MySQL資料庫讀取資料的實戰範例,展示如何在HTML頁面中動態顯示查詢結果。此範例使用XMLHttpRequest建立資料庫連接,發送查詢並處理回應,從而將資料填入頁面元素中,實現了HTML讀取資料庫的功能。

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

PHP是一種廣泛應用於網站開發的後端程式語言,它具有強大的資料庫操作功能,常用於與MySQL等資料庫進行互動。然而,由於中文字元編碼的複雜性,在處理資料庫中文亂碼時常常會出現問題。本文將介紹PHP處理資料庫中文亂碼的技巧與實踐,包括常見的亂碼原因、解決方法和具體的程式碼範例。常見的亂碼原因資料庫字元集設定不正確:資料庫建立時需選擇正確的字元集,如utf8或u

透過Go標準庫database/sql包,可以連接到MySQL、PostgreSQL或SQLite等遠端資料庫:建立包含資料庫連接資訊的連接字串。使用sql.Open()函數開啟資料庫連線。執行SQL查詢和插入操作等資料庫操作。使用defer關閉資料庫連線以釋放資源。
