日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

动态构建siteMap(导航,asp.net)

發布時間:2025/4/16 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态构建siteMap(导航,asp.net) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里介紹兩種主要的方法, 先進行情景假定:
假定進入一個主頁, 此主頁包含兩大模塊, 一個叫做mod1, 一個叫做mod2, 點擊第一個模塊進行mod1 的主頁, 左側有樹形列表顯示mod1 的內容, 點擊mod2 也跟mod1 一樣, 不同之處在于左側樹形列表要顯示mod2 的內容.
由于實際上可能有許多個模塊, 所以為每個模塊做一套頁面是極不明智的做法, 應該只做一個模塊主頁, 因參數的不同而顯示不同的內容, 在這種需求下, 樹形列表treeview 必須展示不同的siteMap.

<1>設定siteMapProvider

這是最簡單直接的做法, 缺點是靈活程度不夠強, 如果遇到因權限的不同而需要不同的視圖時, 這種方法就有點無能為力了. 但是在上面的情景假定中, 這應該是最理想的解決方案:
<1.1>配置web.config.
在system.web 節點下, 增加siteMap的定義, 示例:
???

?<siteMap?>
??????
<providers>
????????
<add?name="mod1"?type="System.Web.XmlSiteMapProvider"?siteMapFile="mod1.sitemap"/>
????????
<add?name="mod2"?type="System.Web.XmlSiteMapProvider"?siteMapFile="mod2.sitemap"/>
??????
</providers>
????
</siteMap>


siteMap 節點本來應該指定一下"defaultProvider" 屬性, 但是由于這里使用siteMap 文件, 正好是其默認的"XmlSiteMapProvider" 類型, 所以無需再次指定.
在providers 里面, 添加對每一個地圖文件的定義, 其中mod1.sitemap 和mod2.sitemap 是已經定義好的兩個sitemap地圖文件. 每個provider的name 屬性必須唯一.

<1.2>配置treeview的前臺代碼
往頁面上放一個treeview控件, 并為它增加一個sitemapDataSource 控件. 代碼:
?這里為它指定一個默認的provider, 引用在web.config 中定義的name屬性名.

?

???????????<asp:TreeView?ID="TreeView1"?runat="server"?DataSourceID="SiteMapDataSource1">
????????????
</asp:TreeView>
????????????
????????????
<asp:SiteMapDataSource?ID="SiteMapDataSource1"?runat="server"?SiteMapProvider="mod1"?/>


<1.3> 配置變更代碼
做為測試, 在頁面上放一個按鈕, 在按鈕的點擊事件中:
??

??????if?(SiteMapDataSource1.SiteMapProvider?==?"mod1")
????????????SiteMapDataSource1.SiteMapProvider?
=?"mod2";
????????
else
????????????SiteMapDataSource1.SiteMapProvider?
=?"mod1";


運行測試, 點擊按鈕, 可以看到treeview 在兩個sitemap 定義之間切換顯示.

?

?

二. 自定義provider 類.

這是最自由的做法, 在這里可以放入任何自定義代碼來定義最終的顯示狀態.
<2.1> 編寫自定義provider 類
這個類應該繼承自StaticSiteMapProvider 類,? 示例代碼:

?

???public?class?mySiteMapProvider?:?StaticSiteMapProvider
????
{
????????
private?SiteMapNode?_root?=?null;

????????
protected?override?void?Clear()
????????
{
????????????_root?
=?null;
????????????
base.Clear();

????????}



????????
public?override?SiteMapNode?BuildSiteMap()
????????
{
????????????
lock?(this)
????????????
{
????????????????Clear();
????????????????_root?
=?new?SiteMapNode(this,?"root",?"url",?"title");

????????????????AddNode(_root,?
null);
????????????????SiteMapNode?cnode?
=?new?SiteMapNode(this,?"sub1",?"suburl1",?"subtitle1");
????????????????AddNode(cnode,?_root);?
????????????????cnode?
=?new?SiteMapNode(this,?"sub2",?"suburl2",?"subtitle2");
????????????????AddNode(cnode,?_root);?

????????????}

????????????
//返回構建后的根節點。
????????????return?_root;


????????}


?


????????
protected?override?SiteMapNode?GetRootNodeCore()
????????
{
????????????
return?RootNode;
????????}


?

????????
public?override?SiteMapNode?RootNode
????????
{
????????????
get
????????????
{
????????????????SiteMapNode?temp?
=?BuildSiteMap();
????????????????
return?temp;
????????????}

????????}


?


????????
public?override?void?Initialize(string?name,?System.Collections.Specialized.NameValueCollection?attributes)
????????
{
????????????
base.Initialize(name,?attributes);
????????}



????}


?

這是一個高度簡化的示意類, 在實際使用中, 絕對不應該用這么簡單的做法, 比如在BuildSiteMap 方法中應加入必要的安全檢查.? 另外, 也是在BuildSiteMap 方法中, 應用實際的數據來代替這里的示意數據, 比如, 可以從數據庫中讀取各個結點. 也可以從xml 文件中讀取.

<2.2>配置web.config
和使用默認的siteMap 文件一樣, 這里也需要配置一下web.config, 代碼:

<siteMap?defaultProvider="mySiteMapProvider">
???
<providers>
????
<add?name="mySiteMapProvider"?type="LCT.mySiteMapProvider"?/>
???
</providers>
??
</siteMap>

?

其中type屬性 須指出完整的命名空間. LCT 是我這個示意所在的命名空間名.

<2.3>前臺代碼:

?

????????????<asp:TreeView?ID="TreeView1"?runat="server"?DataSourceID="SiteMapDataSource1">
????????????
</asp:TreeView>
????????????
????????????
<asp:SiteMapDataSource?ID="SiteMapDataSource1"?runat="server"/>


實際上不需要對前臺進行任何的多余指定, siteMapDataSource 會自動對默認的provider 進行數據讀取.

?至于顯示哪一個mod 的sitemap, 只要把要顯示的mod的名字寫進一個session 變量里, 然后在build 的時候讀取一下即可, 在通用類(而不是頁面代碼)? 里使用當前頁的session 等狀態的方法是:
System.Web.HttpContext.Current.Session["XXXX"]
感謝Jack Niu? 告訴我這個方法。

轉載于:https://www.cnblogs.com/Moosdau/archive/2007/09/28/908757.html

總結

以上是生活随笔為你收集整理的动态构建siteMap(导航,asp.net)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。