动态构建siteMap(导航,asp.net)
這里介紹兩種主要的方法, 先進行情景假定:
假定進入一個主頁, 此主頁包含兩大模塊, 一個叫做mod1, 一個叫做mod2, 點擊第一個模塊進行mod1 的主頁, 左側有樹形列表顯示mod1 的內容, 點擊mod2 也跟mod1 一樣, 不同之處在于左側樹形列表要顯示mod2 的內容.
由于實際上可能有許多個模塊, 所以為每個模塊做一套頁面是極不明智的做法, 應該只做一個模塊主頁, 因參數的不同而顯示不同的內容, 在這種需求下, 樹形列表treeview 必須展示不同的siteMap.
<1>設定siteMapProvider
這是最簡單直接的做法, 缺點是靈活程度不夠強, 如果遇到因權限的不同而需要不同的視圖時, 這種方法就有點無能為力了. 但是在上面的情景假定中, 這應該是最理想的解決方案:
<1.1>配置web.config.
在system.web 節點下, 增加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> 配置變更代碼
做為測試, 在頁面上放一個按鈕, 在按鈕的點擊事件中:
??
????????????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, 代碼:
???<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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 滑板动作姿势简介
- 下一篇: SVG脚本编程简介(转)