動態修改SiteMapPath路徑
http://www.purecs.net/Threads/t376.aspx
在網頁上放置一個SiteMapPath可以提供使用者一個清楚的瀏覽路標指示,如果你的SiteMap是靜態不會變動的倒是很簡單,只要編寫好一個XML檔放上去,其它的事就可以不用管了,但是在動態網頁中SiteMap的路徑可能會隨著不同的情況而有所更動,這時預先建立的靜態SiteMap似乎就不怎麼好用了,因為你無法事先去預測SiteMap該有哪些路徑(就像現在這個論壇上面的SiteMap),這個時後你必需要用程式動態控制SiteMapPath中Node的連結路徑及顯示的文字,現在只要跟著下面的步驟做就可以簡單的做到這個功能。
1. 先在Web Form中建立一個ModifyPath方法
2. 在Page_Load 中註冊SiteMapResolve事件給ModifyPath方法
3. 最後在ModifyPath中撰寫動態路徑及所顯示的文字程式碼即可
好了,你現在應該可以看到一點點成果,至少SiteMapPath中的結點能被程式控制了,剩下的只需要寫出ModifyPath中真正的取得路徑的程式碼,動態修改SiteMapPath就是這麼簡單。
在網頁上放置一個SiteMapPath可以提供使用者一個清楚的瀏覽路標指示,如果你的SiteMap是靜態不會變動的倒是很簡單,只要編寫好一個XML檔放上去,其它的事就可以不用管了,但是在動態網頁中SiteMap的路徑可能會隨著不同的情況而有所更動,這時預先建立的靜態SiteMap似乎就不怎麼好用了,因為你無法事先去預測SiteMap該有哪些路徑(就像現在這個論壇上面的SiteMap),這個時後你必需要用程式動態控制SiteMapPath中Node的連結路徑及顯示的文字,現在只要跟著下面的步驟做就可以簡單的做到這個功能。
1. 先在Web Form中建立一個ModifyPath方法
2. 在Page_Load 中註冊SiteMapResolve事件給ModifyPath方法
3. 最後在ModifyPath中撰寫動態路徑及所顯示的文字程式碼即可
1 | private SiteMapNode ModifyPath(object sender, SiteMapResolveEventArgs e) |
2 | { |
3 | SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true); |
4 | SiteMapNode modifyNode = currentNode; |
5 | |
6 | modifyNode.Url = "http://www.bbb.net"; |
7 | modifyNode.Title = "bbb"; |
8 | |
9 | if ( (modifyNode = modifyNode.ParentNode) != null) |
10 | { |
11 | modifyNode.Url = "http://www.aaa.net"; |
12 | modifyNode.Title = "aaa"; |
13 | } |
14 | |
15 | return currentNode; |
16 | } |
看不清楚 | 列印 | 複製 |
好了,你現在應該可以看到一點點成果,至少SiteMapPath中的結點能被程式控制了,剩下的只需要寫出ModifyPath中真正的取得路徑的程式碼,動態修改SiteMapPath就是這麼簡單。
1 | protected void Page_Load(object sender, EventArgs e) |
2 | { |
3 | SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ModifyPath); |
4 | } |
5 | |
6 | private SiteMapNode ModifyPath(object sender, SiteMapResolveEventArgs e) |
7 | { |
8 | SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true); |
9 | SiteMapNode modifyNode = currentNode; |
10 | modifyNode.Url = "http://www.bbb.net"; |
11 | modifyNode.Title = "bbb"; |
12 | |
13 | if ( (modifyNode = modifyNode.ParentNode) != null) |
14 | { |
15 | modifyNode.Url = "http://www.aaa.net"; |
16 | modifyNode.Title = "aaa"; |
17 | } |
18 | |
19 | return currentNode; |
20 | } |
看不清楚 | 列印 | 複製 |
那如果是动态的无限级的网站应该怎么做呢,用递归上去做结点吗?可是结点数量不一样啊
Re: 動態修改SiteMapPath路徑
由 admin 在 17:20 發表
SiteMapNode有一個ChildNodes集合屬性
包含Add、Insert、Remove、Clear等方法可以用來新增或是刪除結點
所以不管是多少層都可以在SiteMapResolve事件中依邏輯增加或減少層級
例如你在這個網站上回文時原本的結點應該是
pure C# 技術社群 >> ASP.NET >> 動態修改SiteMpaPath路徑 >> 回覆文章
但是在程式中已經把 "回覆文章" 這個節點刪除掉了
所以無論是用遞歸或是任何你想的到的方法都可以
只要能自由的新增、刪除、修改結點就沒什麼是做不到的
包含Add、Insert、Remove、Clear等方法可以用來新增或是刪除結點
所以不管是多少層都可以在SiteMapResolve事件中依邏輯增加或減少層級
例如你在這個網站上回文時原本的結點應該是
pure C# 技術社群 >> ASP.NET >> 動態修改SiteMpaPath路徑 >> 回覆文章
但是在程式中已經把 "回覆文章" 這個節點刪除掉了
1 | //currentNode 為"回覆文章" |
2 | SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true); |
3 | |
4 | if (currentNode.Key.EndsWith("PostEditor.aspx".ToLower())) |
5 | { |
6 | //currentNode 為"回覆文章"的上一層 "動態修改SiteMpaPath路徑" |
7 | currentNode = currentNode.ParentNode; |
8 | currentNode.ChildNodes.Clear(); |
9 | } |
看不清楚 | 列印 | 複製 |
所以無論是用遞歸或是任何你想的到的方法都可以
只要能自由的新增、刪除、修改結點就沒什麼是做不到的