維護大型網站選單向來耗時費力。ASP.NET 內建導航架構,將網站結構定義於 XML 格式的 web.sitemap 檔案,搭配三大導航控制項(Menu、TreeView、SiteMapPath)實現動態選單、多層樹狀導航與麵包屑路徑顯示。
web.sitemap 放置於網站根目錄,定義頁面階層結構SiteMapDataSource 控制項自動連接預設 sitemap 檔案DataSourceID 繫結至 SiteMapDataSource<?xml version="1.0" encoding="utf-8"?>
<siteMap>
<siteMapNode title="Home" url="/Default.aspx">
<siteMapNode title="Products" url="/Products.aspx">
<siteMapNode title="Hardware" url="/Hardware.aspx" />
<siteMapNode title="Software" url="/Software.aspx" />
</siteMapNode>
<siteMapNode title="Services" url="/Services.aspx">
<siteMapNode title="Training" url="/Training.aspx" />
<siteMapNode title="Support" url="/Support.aspx" />
</siteMapNode>
<siteMapNode title="About Us" url="/About.aspx" />
</siteMapNode>
</siteMap>
<siteMap><siteMap> 下僅能有一個根 <siteMapNode>(對應首頁)<siteMapNode> 可包含多個子節點title(顯示文字)與 url(相對根目錄路徑)屬性適用於水平或垂直導覽列,支援滑鼠滑入展開子選單。
<asp:SiteMapDataSource ID="smdsMain" runat="server" />
<form runat="server">
<asp:Menu runat="server" DataSourceID="smdsMain"
Orientation="Horizontal"
StaticDisplayLevels="2"
MaximumDynamicDisplayLevels="3" />
</form>
Orientation:Horizontal(水平)或 Vertical(垂直)StaticDisplayLevels:靜態顯示層級數MaximumDynamicDisplayLevels:動態展開最大層級StaticMenuStyle、DynamicMenuStyle、StaticMenuItemStyle、DynamicMenuItemStyle:CSS 樣式自訂類似 Windows 檔案總管左側樹狀結構,支援節點展開/摺疊(+/- 圖示)。
<asp:SiteMapDataSource ID="smdsMain" runat="server" />
<form runat="server">
<asp:TreeView runat="server" DataSourceID="smdsMain"
ExpandDepth="1"
ShowLines="true"
NodeIndent="15" />
</form>
ExpandDepth:初始展開深度(0=全摺疊,-1=全展開)ShowLines:顯示連接線NodeIndent:子節點縮排像素NodeStyle、ParentNodeStyle、LeafNodeStyle、SelectedNodeStyle:各狀態樣式TreeNodePopulate 事件實現按需載入大型樹狀結構顯示當前頁面在網站架構中的路徑(如:Home > Products > Hardware),每層皆為可點擊連結。
<form runat="server">
<asp:SiteMapPath runat="server"
PathSeparator=" > "
PathDirection="RootToCurrent"
RenderCurrentNodeAsLink="false" />
</form>
SiteMapDataSource,直接讀取 web.sitemapweb.sitemap 中 URL 路徑拼寫錯誤PathDirection:RootToCurrent(預設)或 CurrentToRootRenderCurrentNodeAsLink:目前節點是否為超連結大型網站可將不同區域拆分為多個 sitemap 檔案,透過 SiteMapDataSource.SiteMapProvider 屬性指定不同 Provider,需在 web.config 註冊多個 XmlSiteMapProvider。
SiteMapDataSource 預設啟用 SecurityTrimmingEnabled="true",會根據使用者角色自動隱藏無權限存取的節點,需配合 web.config authorization 設定。
繼承 StaticSiteMapProvider 可從資料庫、API 或其他來源動態建構網站地圖,適用於動態內容管理系統。
.level1、.level2 等)<table> 結構,TreeView 產出 <ul><li>,方便 CSS 選取器定位| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 選單不顯示 | web.sitemap 路徑錯誤、XML 格式錯誤 | 檢查檔案位於根目錄、XML 結構符合規範 |
| 所有頁面都顯示同一層級 | SiteMapDataSource 缺少 StartingNodeUrl | 設定 StartingNodeUrl 或 StartingNodeOffset |
| 安全性修剪不生效 | 未設定 roles 屬性或 web.config authorization 缺漏 | 在 siteMapNode 加 roles="Admin",web.config 設定 <allow roles="Admin"> |
| TreeView 展開狀態不保持 | PostBack 導致狀態重置 | 使用 ViewState 或 Session 記錄展開節點,Page_Load 還原 |
掌握 ASP.NET 導航架構,能大幅降低大型網站維護成本,提升使用者體驗。下一節將介紹母版頁實現版面統一管理。