蓝色信仰

博客园 首页 新随笔 联系 订阅 管理

        今天又发现了一些新问题,其中就有一个关于动态修改 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;  
     }

posted on 2012-03-06 22:11  蓝色信仰  阅读(236)  评论(0)    收藏  举报