ASP.NET 2.0 的 SiteMapDataSource 搭配 TreeView 和 Menu 控制項,很快就可以作出網站的選單。只是 SiteMapDataSource 預設的資料提供者是 XmlSiteMapProvider,所有選單的資料都是來自 web.sitemap 這個 XML 檔案。但實務上,網站的選單經常會根據使用者的權限來動態建立,並且把選單項目的資料儲存在資料庫中。在這種情形下,就不能使用預設的 XmlSiteMapProvider 了。

.NET Framework 2.0 只提供了 XmlSiteMapProvider,不過我們可以自己寫一個 site map provider,只要繼承自虛擬類別 SiteMapProvider,並且實作一些必要的方法就行了。MSDN 網站上有一篇文章名為「Site Map Providers」, 介紹了如何撰寫簡易的 SqlSiteMapProvider 類別,讓你可以把網站的選單資料存放在 SQL Server 資料庫裡面。這個 SqlSiteMapProvider 是繼承自 StaticSiteMapProvider,而不是 SiteMapProvider,因為 StaticSiteMapProvider 已經提供了一些實作,讓我們可以花很少的工夫就完成自訂的 site map provider。我實際測試了這篇文章的 SqlSiteMapProvider 類別,蠻實用的,只要稍微修改就能符合自己的需求。

SqlSiteMapProvider 的使用步驟如下:

  1. 將網站地圖的資料建立在資料庫中,建立 SiteMap 資料表的 SQL 命令請參考該文。
  2. 把 SqlSiteMapProvider.cs 放到網站的 App_Code 資料夾底下(註:App_Code 是網站的特殊資料夾,放在這裡的程式碼可直接在網站中的任何地方使用)。
  3. 修改 Web.config,加入連線字串以及網站地圖的設定,例如:
    <configuration>
      <connectionStrings>
        <add name="SiteMapConnectionString" connectionString="你的連線字串"/>
      </connectionStrings>
      <system.web>
        <siteMap enabled="true"  defaultProvider="AspNetSqlSiteMapProvider">
          <providers>
            <add name="AspNetSqlSiteMapProvider" type="SqlSiteMapProvider"
    description="SQL Server site map provider"
    securityTrimmingEnabled="true"
    connectionStringName="SiteMapConnectionString"/>
    </providers> </siteMap> </system.web> </configuration>
  4. 從 Toolbox 拉一個 SiteMapDataSource 和 TreeView 到網頁上,設定 TreeView1 的 DataSourceID 屬性為 SiteMapDataSource1。
  5. 用瀏覽器檢視網頁。

SqlSiteMapProvider 我只有在 SQL Server 上面測試過,如果要用在 Oracle 資料庫,應該只要稍微修改一下就行了。這裡也有一個 Oracle SiteMap Provider,不過看起來似乎還不完整。

其他參考資料: