SiteMap網站地圖在網站建設的時候是很有用的它可以直接綁定在Men和TreeView控件上還有一個指示當前路徑的SiteMapPath控件也可以直接綁定
這是他常用的xml定義<siteMapNode url=Course/Group/GroupListaspx title=GroupAdmin >這個SiteMap的權限已經和Membership結合起來了不同權限的用戶所看到的地圖已經被控制了可以配置role屬性來擴展例外的訪問許可注意是例外的訪問許可
<siteMapNode url=Course/Tests/TestListaspx title=TestAdmin role=student>這裡有些介紹
簡單的使用這裡不作贅述只是討論一下怎麼和擴展一下讓他可以訪問資源時附帶參數
首先介紹這樣一個資源MySiteMapTool這位仁兄已經提供了一個工具可以在程序中轉發帶參數的請求比如 MySiteMapForward(Details AlbumID={}&Page={} )確是簡單實用
現在想要的功能是因為各個液面都需要不同的參數所以在沒有這些參數的情況下就禁止用戶訪問那個頁面轉而訪問父一級頁面遞歸
首先SiteMap本身有個SiteMapResolve事件在當前路徑被解析時觸發這是一段來自MSDN的代碼
private void Page_Load(object sender EventArgs e)
{ // The ExpandForumPaths method is called to handle // the SiteMapResolve event SiteMapSiteMapResolve += new SiteMapResolveEventHandler(thisExpandForumPaths)}
private SiteMapNode ExpandForumPaths(Object sender SiteMapResolveEventArgs e)
{ // The current node represents a Post page in a bulletin board forum // Clone the current node and all of its relevant parents This // returns a site map node that a developer can then // walk modifying each nodeUrl property in turn // Since the cloned nodes are separate from the underlying // site navigation structure the fixups that are made do not // effect the overall site navigation structure SiteMapNode currentNode = SiteMapCurrentNodeClone(true)SiteMapNode tempNode = currentNode
// Obtain the recent IDs int forumGroupID = GetMostRecentForumGroupID()int forumID = GetMostRecentForumID(forumGroupID)int postID = GetMostRecentPostID(forumID)
// The current node and its parents can be modified to include // dynamic querystring information relevant to the currently // executing request if ( != postID)
{ tempNodeUrl = tempNodeUrl + ?PostID= + postIDToString()}
if ((null != (tempNode = tempNodeParentNode)) &&( != forumID))
{ tempNodeUrl = tempNodeUrl + ?ForumID= + forumIDToString()}
if ((null != (tempNode = tempNodeParentNode)) &&( != forumGroupID))
{ tempNodeUrl = tempNodeUrl + ?ForumGroupID= + forumGroupIDToString()}
return currentNode}
這段代碼只是給當前路徑加載參數
曾經嘗試過使用類似的方法但是SiteMapPath搞定了Menu就綁定不上數據了並且只能處理一部分數據
後來結合SiteMapTool那個類又寫出幾個函數可以解決這個問題這是修改之後的sitemap文件加了一個配置項rule裡面的參數是這個頁面需要的參數如果當前上下文沒有這些參數那麼禁止用戶訪問這個頁面
<siteMapNode url=Course/Group/GroupDetailaspx title=Group Detail rule=cidgid>這是兩個函數遞歸處理所有的路徑 private string MakeURL(SiteMapNode node)
{ nodeReadOnly = false//find the static url string url = MySiteMapFindForward(nodeTitle)if (node[rule] != null && node[rule]Length > )
{ //if have the rulethen check string[] paramSet = node[rule]Split()//check for (int i = i < paramSetLength i++)
{ //if request have not such a param then invoke self to check his parent if (HttpContextCurrentRequestParams[paramSet[i]] == null)
return MakeURL(nodeParentNode)} //if pass then add all the params and return the value url += ?for (int i = i < paramSetLength i++)
{ string key = paramSet[i]//cid——>cid= the former format is like rule=cidtid url = url + key + = + HttpContextCurrentRequestParams[key] + &} return urlSubstring( urlLength ) //remove last &
} else { //if there is no rule then return the url directly return url} } private void ReBindData(SiteMapNode root)
{ string url = MakeURL(root)if (url != )
rootUrl = urlfor (int i = i < rootChildNodesCount i++)
{ ReBindData(rootChildNodes[i])} }在ReBindData裡面遞歸調用MakeUrl函數
MakeUrl函數裡面調用的MySiteMapFindForward函數就是來自那位的實現
不過應用的是後需要做一些改動他原來的實現是用靜態的類如此加載//SiteMapNodeCollection smc = SiteMapRootNodeGetAllNodes()//siteMapCol = new NameValueCollection()
//IEnumerator ie = smcGetEnumerator()//while (ieMoveNext())
//{ // siteMapCol[((SiteMapNode)ieCurrent)Title] = ((SiteMapNode)ieCurrent)Url//}但是由於用戶在沒有登陸的時候限於權限它能訪問的頁面有限所以SiteMapRootNodeGetAllNodes()得到的不是所有數據可能只是一部分或者改動方式就是自己寫一個函數直接讀取xml文件遞歸獲取所有數據定義
From:http://tw.wingwit.com/Article/program/net/201311/11277.html