標準 Web.sitemap 配合 Menu、SiteMapPath 可產生導航選單與「您現在的位置」,但缺乏控制轉發功能(Struts 強項)。在 ASP.NET 只需幾行程式碼即可補全此能力。
<?xml version="1.0" encoding="utf-8" ?>
<siteMap>
<siteMapNode title="Home" url="Default.aspx" description="This is my homepage" >
<siteMapNode title="Resume" url="Resume.aspx" />
<siteMapNode title="Links" url="Links.aspx" />
<siteMapNode title="Albums" url="Albums.aspx" >
<siteMapNode title="Photos" url="Photos.aspx" >
<siteMapNode title="Details" url="Details.aspx" />
</siteMapNode>
</siteMapNode>
<siteMapNode title="Register" url="Register.aspx" />
<siteMapNode title="Manage" url="Admin/Albums.aspx" roles="Administrators">
<siteMapNode title="Photos" url="Admin/Photos.aspx" >
<siteMapNode title="Details" url="Admin/Details.aspx" />
</siteMapNode>
</siteMapNode>
</siteMapNode>
</siteMap>
using System;
using System.Web;
using System.Collections.Specialized;
using System.Collections;
public static class MySiteMap {
static NameValueCollection siteMapCol;
static MySiteMap() {
SiteMapNodeCollection smc = SiteMap.RootNode.GetAllNodes();
siteMapCol = new NameValueCollection();
IEnumerator ie = smc.GetEnumerator();
while (ie.MoveNext()) {
siteMapCol[((SiteMapNode)ie.Current).Title] = ((SiteMapNode)ie.Current).Url;
}
}
public static string FindForward(string key) {
return siteMapCol[key];
}
public static string FindForward(string key, string paramsFormat, params object[] paramsValue) {
return String.Format(FindForward(key) + "?" + paramsFormat, paramsValue);
}
public static void Forward(string key) {
HttpContext.Current.Response.Redirect(FindForward(key));
}
public static void Forward(string key, string paramsFormat, params object[] paramsValue) {
HttpContext.Current.Response.Redirect(FindForward(key, paramsFormat, paramsValue));
}
public static void Transfer(string key) {
HttpContext.Current.Server.Transfer(FindForward(key));
}
public static void Transfer(string key, string paramsFormat, params object[] paramsValue) {
HttpContext.Current.Server.Transfer(FindForward(key, paramsFormat, paramsValue));
}
}
| 方法 | 功能 | 支援參數 |
|---|---|---|
FindForward | 依 Title 取得 URL | 無 / 有 |
Forward | 客戶端導向 (Response.Redirect) | 無 / 有 |
Transfer | 伺服端轉送,保留 Context (Server.Transfer) | 無 / 有 |
// 取得 URL
Response.Write(MySiteMap.FindForward("Details"));
// 輸出: /MyWebSite/Details.aspx
// 攜帶參數導向
MySiteMap.Forward("Details", "AlbumID={0}&Page={1}", 1, 4);
// 實際導向: /MyWebSite/Details.aspx?AlbumID=1&Page=4
SiteMap.RootNode.GetAllNodes() 讀取全站節點,建立 Title→Url 對應集合,查詢時 O(1) 取得將類別檔置於 App_Code 即可專案全域使用,輕鬆賦予 SiteMap 控制轉發能力。