ASP.NET 2.0 站點導航架構不僅提供宣告式控制項,更開放豐富的程式化 API,讓開發者動態查詢、修改、擴充站點地圖資料。本文深入探討 SiteMap 類別核心成員、SiteMapResolve 事件應用,以及 SiteMapPath(麵包屑)控制項的客製化技巧。
| 成員 | 說明 |
|---|---|
CurrentNode | 目前頁面對應的 SiteMapNode,若無對應節點回傳 null。 |
RootNode | 站點地圖根節點,遞迴 ChildNodes 可走訪完整樹狀結構。 |
Provider | 預設 SiteMapProvider 實例(通常為 XmlSiteMapProvider)。 |
Providers | 所有已註冊提供者集合,鍵為提供者名稱。 |
FindSiteMapNode(url) | 依相對/絕對 URL 查找對應節點。 |
FindSiteMapNodeFromKey(key) | 依提供者內部鍵值查找節點。 |
Title、Description、Url、Roles:對應 XML 屬性。ParentNode、ChildNodes、NextSibling、PreviousSibling:樹狀導覽。Item[key]:存取自訂屬性(如 target、icon)。IsAccessibleToUser(context):安全性修剪檢查。在 Global.asax 或頁面 Page_Load 訂閱:
void Application_Start()
{
SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(OnSiteMapResolve);
}
SiteMapNode OnSiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
SiteMapNode current = SiteMap.CurrentNode.Clone(true); // 深層複製避免修改快取
if (current != null)
{
// 動態帶入查詢字串參數
current.Url += "?user=" + Context.User.Identity.Name;
// 或依權限動態調整標題
if (Context.User.IsInRole("Admin"))
current.Title += " (管理員)";
}
return current;
}
此事件在導航控制項繫資料前觸發,回傳修飾後的節點樹將用於呈現。
| 樣式屬性 | 套用目標 |
|---|---|
PathSeparatorStyle | 分隔符號(預設 >) |
CurrentNodeStyle | 目前頁面節點 |
RootNodeStyle | 根節點(通常為 Home) |
NodeStyle | 中間路徑節點 |
PathDirection | RootToCurrent(預設)或 CurrentToRoot |
<asp:SiteMapPath ID="SiteMapPath1" runat="server" PathDirection="RootToCurrent">
<PathSeparatorTemplate>
<span class="separator"> » </span>
</PathSeparatorTemplate>
<CurrentNodeTemplate>
<span class="current"><%# Eval("Title") %></span>
</CurrentNodeTemplate>
<RootNodeTemplate>
<asp:HyperLink NavigateUrl="~/" Text="首頁" />
</RootNodeTemplate>
<NodeTemplate>
<asp:HyperLink NavigateUrl='<%# Eval("Url") %>' Text='<%# Eval("Title") %>' />
</NodeTemplate>
</asp:SiteMapPath>
繼承 StaticSiteMapProvider 實作 BuildSiteMap(),從資料庫、Web Service、CMS API 動態建構節點樹,配合快取機制(HttpRuntime.Cache)提升效能。適用於:
SiteMap.CurrentNode 可能為 null(非站點地圖內頁面),使用前必須檢查。SiteMapResolve 回傳節點務必 Clone(true),避免污染提供者內部快取樹狀結構。custom:icon)避免衝突。掌握程式化 SiteMap API,讓導航架構從靜態定義進化為動態、智慧、個人化的使用者導覽體驗核心。