使用自訂網站地圖提供者控制ASP.NET的菜單

來源:互聯網
上載者:User

         ASP.NET提供的網站地圖為我們建立導覽列和菜單提供了極大的方便。此外我們還可以建立自己的網站地圖提供者,從而使我們的功能表項目可控。

 

    先來瞭解下menu等導航控制項與網站地圖的關係。我們在ASP
.NET項目中所建立的web.siteMap
其實就是一個遵循一定規範的xml檔案,我們叫它網站地圖檔。Dot net
為我們定義了網站地圖提供者。這個網站地圖提供者所完成的任務就是要讀出我們所需要作為導航的資料。例如ASP.NET
預設的網站地圖提供者是xmlSiteMapProvider(其實就是一個類),通常情況下,menu等web導航控制項是通過此類讀取web.siteMap檔案中的資料的。

 

         Dot net
中有預設的網站地圖提供者,同時它也允許我們自己建立自己的網站地圖提供者(類),也就是提供一個從其他資料來源中讀資料的類。多數情況下,我們的資料會存在資料庫中,而不僅僅是固定在web.siteMap檔案中。這時我們網站地圖提供者,便可以繼承StaticSiteMapProvider類來完成了。實現此類有三個方法是必須重寫的,它們是:Initialize,GetRootNodeCore和BuildSiteMap。

 

    完成自己的網站地圖提供者後,我們還需要告訴ASP DOT NET
預設提供者是我們建立的類。這需要在web.config設定檔中設定。代碼如下:

<siteMap>

         
<providers>

              
<add
name="mySiteMapProvider"
type="SiteProviderExe"
conn="Data Source=MICROSO-1PGF29S/SQLEXPRESS;Initial Catalog=Demo;User ID=sa;Password=123;"/>

         
</providers>

      
</siteMap>

 要注意 這部分代碼是在設定檔中的< system.web>標籤中設定的。其中的類型(type)就是我們網站地圖提供者的類的類型,name則是隨便起的,後面的字串是串連資料庫的字串。

 完成這後我們還需要在web.siteMap檔案中添加節點:<siteMapNode
provider="mySiteMapProvider" />,注意這就是剛才的name

 再在資料庫中存好我們的檔案就可以了。不過現在我們還沒給自己供程式的網站地圖提的實現代碼呢,如下:

 using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;//引入需要的命名空間using System.Data.SqlClient;using System.Collections.Specialized;using System.Collections;using System.Security.Permissions;/**//// <summary>/// sqlsitemap 的摘要說明/// </summary>[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]//許可權說明public class SiteProviderExe:StaticSiteMapProvider{ private SiteMapNode SMNode = null; private SiteMapNode rootNode = null; private SqlConnection conn = null; private string ConnString = "smcstring"; //申明 節點,資料庫連接,連接字串三個變數 public sqlsitemap() { } private bool initialized = false; public virtual bool IsInitialized {//重寫基類IsInitialized屬性,在調用基類 Initialize 之後在該方法中執行自己的初始化 get { return initialized; } } protected override SiteMapNode GetRootNodeCore() {//重寫基類GetRootNodeCore方法,使之返回RootNode這個屬性 return BuildSiteMap(); } public override void Initialize(string name, NameValueCollection attributes) {//重寫基類Initialize方法,初始化資料連線,如果成功,那麼將initialized設定為true if (IsInitialized) { return; } base.Initialize(name, attributes); //調用基類Initialize方法來初始化 string SqlConnString = attributes[ConnString]; if (SqlConnString == null) {//看資料庫連接是否存在 throw new Exception("資料連線不存在"); } else {//初始化串連 conn = new SqlConnection(SqlConnString); } initialized = true; } protected override void Clear() { lock (this) { if (rootNode == null) base.Clear(); } } public override SiteMapNode BuildSiteMap() { lock (this) {//鎖定 if (!IsInitialized) {//判斷是否初始化了 throw new Exception("資料未初始化"); } else { if (rootNode == null) { Clear(); int rootNodeId = -1; if (conn.State == ConnectionState.Closed) {//如果當前串連是關閉的,就開啟它 conn.Open(); } //迴圈 SqlCommand cmd = new SqlCommand("select rid,url,title,disp from rootsitemap where rn=0", conn); SqlDataReader sdr = cmd.ExecuteReader(); if (sdr.HasRows) { sdr.Read(); SMNode = new SiteMapNode(this, sdr.GetString(0), sdr.GetString(1), sdr.GetString(2), sdr.GetString(3)); } sdr.Close(); //進入ROOTNODE節點 SqlDataAdapter rootsda = new SqlDataAdapter("select rid,url,title,disp from rootsitemap where rn=1", conn); DataSet ds = new DataSet(); rootsda.Fill(ds, "root"); DataView rdv = ds.Tables["root"].DefaultView; if (rdv.Count > 0) { foreach (DataRowView drv in rdv) { rootNodeId = Convert.ToInt32(drv["rid"]); rootNode = new SiteMapNode(this, drv["rid"].ToString(), drv["url"].ToString(), drv["title"].ToString(), drv["disp"].ToString()); //進入子節點查詢 SqlCommand childcmd = new SqlCommand("select nid,url,title,disp from sitemap where node=" + rootNodeId + "", conn); SqlDataReader childRead = childcmd.ExecuteReader(); if (childRead.HasRows) { SiteMapNode childNode = null; while (childRead.Read()) { childNode = new SiteMapNode(this, childRead.GetString(0).ToString(), childRead.GetString(1), childRead.GetString(2), childRead.GetString(3)); AddNode(childNode, rootNode); } } childRead.Close(); AddNode(rootNode, SMNode); } conn.Close(); } else { return null; } } } return SMNode; } }}

 

上面這個網站地圖提供者要從資料庫中讀資料,它用到了兩張表,如下:

 

大體就是這樣。實現的重點是要清楚網站地圖提供者的作用是從資料來源中讀出需要在menu等web導航控制項中顯示和串連的資料。本例中使用sql server作為資料來源。但XMLSiteMapProvider 的資料來源則是以siteMap為檔案類型的檔案。想整清楚,我們還需要看一下Systemweb 命名空間下StaticSiteMapProvider ,XmlsiteMapProvider,SiteMapNode
等類以及System.data命名空間下DataView等類的使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.