ASP.NET網站導覽(四)

來源:互聯網
上載者:User
根據資料庫產生網站導覽(轉) 繼承自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檔案中聲明<siteMapNode provider="SomeSiteMapProvider" />來配置。如果你的SiteMapProvider中還要引用另外一個SiteMapProvider,那麼父SiteMapProvider僅需要在自己提供的SiteMap中包含下一級SiteMap的根節點,這通常可以通過下一級的SiteMapProvider.GetRootNodeCore方法擷取,同時設定子SiteMapProvider的ParentProvider屬性為父SiteMapProvider,這就行了。

最後,如果你覺得本系列的文章對你有價值,可以考慮訂閱Cat in dotNET,或者通過文章下方的書籤服務按鈕將本文推薦給更多人看。

原文連結:http://hi.baidu.com/thinsoft/blog/item/f3c724cf5454523bf9dc61f0.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.