[转贴]動態修改SiteMapPath路徑
今天又发现了一些新问题,其中就有一个关于动态修改 SiteMapPath的问题。找了N个网页,也试了N种方法,不过其实也就那么几个来回重复。终于在一个帖子中找到了解决的方法,贴出来以备将来使用。
由于原文是帖子问答的形式,本文整理为说明形式(原文的繁体未作修改)。
原文地址:http://www.purecs.net/thread/topic376_1.aspx
http://www.purecs.net/thread/topic479_1.aspx
实例:
pure C# 技術社群 » ASP.NET » 動態修改SiteMapPath路徑
在網頁上放置一個SiteMapPath可以提供使用者一個清楚的瀏覽路標指示,如果你的SiteMap是靜態不會變動的倒是很簡單,只要編寫好一個XML檔放上去,其它的事就可以不用管了,但是在動態網頁中SiteMap的路徑可能會隨著不同的情況而有所更動,這時預先建立的靜態SiteMap似乎就不怎麼好用了,因為你無法事先去預測SiteMap該有哪些路徑(就像現在這個論壇上面的SiteMap),這個時後你必需要用程式動態控制SiteMapPath中Node的連結路徑及顯示的文字,現在只要跟著下面的步驟做就可以簡單的做到這個功能。
1. 先在Web Form中建立一個ModifyPath方法
private SiteMapNode ModifyPath(Object sender, SiteMapResolveEventArgs e)
2. 在Page_Load 中註冊SiteMapResolve事件給ModifyPath方法
SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(this.ModifyPath);
3. 最後在ModifyPath中撰寫動態路徑及所顯示的文字程式碼即可
private SiteMapNode ModifyPath(object sender, SiteMapResolveEventArgs e)
...{
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNode modifyNode = currentNode;
modifyNode.Url = "http://www.bbb.net";
modifyNode.Title = "bbb";
if ( (modifyNode = modifyNode.ParentNode) != null)
...{
modifyNode.Url = "http://www.aaa.net";
modifyNode.Title = "aaa";
}
return currentNode;
}
好了,你現在應該可以看到一點點成果,至少SiteMapPath中的結點能被程式控制了,剩下的只需要寫出ModifyPath中真正的取得路徑的程式碼,動態修改SiteMapPath就是這麼簡單。
SiteMapNode有一個ChildNodes集合屬性,包含Add、Insert、Remove、Clear等方法可以用來新增或是刪除結點,所以不管是多少層都可以在SiteMapResolve事件中依邏輯增加或減少層級,例如你在這個網站上回文時原本的結點應該是
pure C# 技術社群 >> ASP.NET >> 動態修改SiteMpaPath路徑 >> 回覆文章
但是在程式中已經把 "回覆文章" 這個節點刪除掉了
程序如下:
//currentNode 為"回覆文章"
SiteMapNode currentNode = SiteMap.CurrentNode.Clone(true);
if (currentNode.Key.EndsWith("PostEditor.aspx".ToLower()))
...{
//currentNode 為"回覆文章"的上一層 "動態修改SiteMpaPath路徑"
currentNode = currentNode.ParentNode;
currentNode.ChildNodes.Clear();
}
现在变成:
pure C# 技術社群 >> ASP.NET >> 動態修改SiteMpaPath路徑
ps:我对上面的路径理解不一定很对,也没有进行测试,如果有错会更新
再如,在当前节点的显示中,加入新的节点可以如下操作(为避免歧义,贴出该功能的程序而与前面无关,当然,原文也是这么写滴,可以偷懒 : D )
效果:
pure C# 技術社群 » ASP.NET » 動態修改SiteMapPath路徑» 新的節點
程序如下:
public partial class SiteMapPathDemo : System.Web.UI.Page
...{
protected void Page_Load(object sender, EventArgs e)
...{
SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(SiteMap_SiteMapResolve);
}
private SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
...{
SiteMapNode currentNode = null;
if (SiteMap.CurrentNode != null)
...{
currentNode = SiteMap.CurrentNode.Clone(true);
SiteMapNodeCollection childNodes = new SiteMapNodeCollection();
SiteMapNode newNode = new SiteMapNode(e.Provider, "newNode", "OthrePage.aspx", "新的節點");
newNode.ParentNode = currentNode;
childNodes.Add(newNode);
currentNode.ChildNodes = childNodes;
currentNode = newNode;
}
return currentNode;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/redfox521/archive/2008/04/07/2257198.aspx