圖1:網站結構 |
圖2:新增一個新的網站地圖 |
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="Home" description="My Web Site"> <siteMapNode url="~/products/default.aspx" title="Products"> <siteMapNode url="~/products/product1.aspx" title="First Product" /> <siteMapNode url="~/products/product2.aspx" title="Second Product" /> </siteMapNode> <siteMapNode url="~/services/default.aspx" title="Services"> <siteMapNode url="~/services/service1.aspx" title="First Service" /> <siteMapNode url="~/services/service2.aspx" title="Second Service" /> </siteMapNode> <siteMapNode url="contact.aspx" title="Contact Us" /> </siteMapNode> </siteMap> |
屬性 | 描述 |
title | 顯示頁面的標題。這個屬性經常由導航控制用於顯示URL的標題。 |
url | 顯示這個結點描述的頁面的URL。 |
description | 指定關於這個頁面的描述。你可以使用這個描述來顯示提示內容。 |
roles | 透過使用安全整修(後面將討論),這個屬性指定允許訪問這個頁面的角色。 |
圖3:Breadcrumb導航 |
Web表單名稱 | 資料夾 |
Default.aspx | Website root |
Contact.aspx | Website root |
Default.aspx | Products |
Product1.aspx | Products |
Product2.aspx | Products |
Default.aspx | Services |
Service1.aspx | Services |
Service2.aspx | Services |
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Font-Size="XX-Large" ForeColor="Blue" Text="Welcome!"></asp:Label><br /> <asp:SiteMapPath ID="SiteMapPath1" runat="server" Font-Names="Verdana" Font-Size="0.8em" PathSeparator=" : "> <PathSeparatorStyle Font-Bold="True" ForeColor="#5D7B9D" /> <CurrentNodeStyle ForeColor="#333333" /> <NodeStyle Font-Bold="True" ForeColor="#7C6F57" /> <RootNodeStyle Font-Bold="True" ForeColor="#5D7B9D" /> </asp:SiteMapPath> <br /> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </form> </body> </html> |
圖4:Default.aspx的範例運行 |
HyperLink ID | Text屬性 | NavigateUrl屬性 |
HyperLink1 | Products | ~/products/default.aspx |
HyperLink2 | Services | ~/Services/default.aspx |
HyperLink3 | Contact Us | ~/contact.aspx |
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <center> <table> <tr> <td width="60%"> <asp:Label ID="Label1" runat="server" Font-Size="X-Large" Text="Welcome to our Web site!"></asp:Label></td> </tr> <tr> <td width="60%"> <asp:HyperLink ID="HyperLink1" runat="server" Font-Size="X-Large" NavigateUrl="~/Products/Default.aspx">Products </asp:HyperLink></td> </tr> <tr> <td width="60%"> <asp:HyperLink ID="HyperLink2" runat="server" Font-Size="X-Large" NavigateUrl="~/Services/Default.aspx">Services </asp:HyperLink></td> </tr> <tr> <td width="60%"> <asp:HyperLink ID="HyperLink3" runat="server" Font-Size="X-Large" NavigateUrl="~/Contact.aspx">Contact Us </asp:HyperLink></td> </tr> </table> </center> </asp:Content> |
圖5:Products資料夾的預設頁面 |
HyperLink ID | Text屬性 | NavigateUrl屬性 |
HyperLink1 | First Product | ~/products/product1.aspx |
HyperLink2 | Second Product | ~/products/product2.aspx |
圖6.Services資料夾的預設頁面 |
HyperLink ID | Text屬性 | NavigateUrl屬性 |
HyperLink1 | First Service | ~/Services/service1.aspx |
HyperLink2 | Second Service | ~/Services/service2.aspx |
Web表單名稱 | Label的Text屬性 |
~/Contact.aspx | Contact Us |
~/Products/Product1.aspx | First Product Details |
~/Products/Product2.aspx | Second Product Details |
~/Services/Service1.aspx | First Service Details |
~/Services/Service2. aspx | Second Service Details |
圖7:Product1.aspx的範例運行 |
注意,web.sitemap檔案的title和URL屬性是怎麼用來產生「breadcrumbs」的。另外,也要注意,父級是如何隨著目前頁面標題一起顯示的。試試導覽至各種頁面並觀察SiteMapPath控制項。
四、 使用SiteMap資料源控件
網站地圖的使用並不僅限於SiteMapPath控制項。你也可以把網站地圖依附到可導航控制(例如TreeView)上。在下列例子中,你將使用相同的網站地圖檔案來實作與一個TreeView控制項的綁定。
把一個新的Web表單SiteMapDataSourceDemo.aspx加入到網站上。然後,把一個SiteMap資料來源控制項(SiteMapDataSource1)和一個TreeView控制項(TreeView1)拖曳到表單上。把這個TreeView控制項的DataSourceID屬性設定為SiteMapDataSource1。另外,還要把該TreeView控制項的ShowLines屬性設為true。以下是SiteMapDataSourceDemo.aspx頁面中的完整的標記:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SiteMapDataSourceDemo.aspx.cs" Inherits="SiteMapDataSourceDemo" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ShowLines="True"> </asp:TreeView> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" /> </form> </body> </html> |
現在,執行這個Web表單以觀察相同的導航結構是怎麼被自動產生到TreeView中的(見圖8)。
圖8:把網站地圖檔綁定到一個TreeView控件 |
屬性 | 描述 |
ChildNodes | 代表當前結點的所有子結點的集合 |
HasChildNodes | 指示是否站點地圖結點具有子結點(true/false) |
Title | 返回在站點地圖檔案中指定的title屬性的值 |
Url | 返回在站點地圖檔案中指定的url屬性的值 |
Description | 傳回在網站地圖檔案中指定的description屬性的值 |
ParentNode | 指出目前結點的父網站地圖結點的參考 |
protected void Page_Load(object sender, EventArgs e) { int count = SiteMap.RootNode.ChildNodes.Count; for (int i = 0; i < count; i++) { SiteMapNode smNode=SiteMap.RootNode.ChildNodes[i]; TreeNode tvNode = new TreeNode(smNode.Title, "", "", smNode.Url, ""); TreeView1.Nodes.Add(tvNode); if (smNode.HasChildNodes) { int childCount=smNode.ChildNodes.Count; for (int j = 0; j < childCount; j++) { SiteMapNode smChildNode = smNode.ChildNodes[j]; TreeNode tvChildNode = new TreeNode(smChildNode.Title, "", "", smChildNode.Url, ""); tvNode.ChildNodes.Add(tvChildNode); } } } } |
在這裡,你首先得到根結點中的子結點的總數。然後,你迴圈遍歷根結點的ChildNodes集合。在每一次遍歷中,你都會建立一個新的TreeNode類別的實例並且在它的建構器中指定它的標題和url。然後,你把這個TreeNode加入到TreeView的Nodes集合中。然後,你檢查是否當前SiteMapNode有任何子結點。如果有,你就對之進行遍歷,重複TreeNode創建過程。注意,這次你把新的TreeNodes加入到目前TreeNode物件的ChildNodes集合中。
請注意,因為你知道只存在兩級的嵌套,所以你在循環中使用了2。為了讓你的邏輯更有一般性,你可以使用遞歸來填滿TreeView。
運行Web表單,那麼你將再次看到類似圖8所示的內容。
六、 使用安全整修
經常情況下,網站都要實現基於角色的安全模式。例如,你可以在你的應用程式中具有不同的角色,例如係統管理員,產品測試員和服務測試員。在這樣的情況中,你經常需要控制顯示給使用者的網站導航連結。例如,如果當前登入的使用者屬於產品測試員角色,那麼你可能只想要顯示與產品相聯繫的鏈接,而隱藏任何其它鏈接。一種處理角色的方法是使用手動編碼,但是,它要求以程式設計方式實現所有的授權邏輯。幸好,網站地圖檔案和SiteMap資料來源控制項一起提供了一種稱為安全整修的特徵來幫助你。
為了測試安全整修,你需要啟動你的網站的會員和角色特徵。開啟web.config檔並且在其中加入下列標記:
<authentication mode="Forms" /> <authorization> <deny users="?"></deny> </authorization> |
<roleManager enabled="true" /> |
圖9:使用Web網站管理工具新增角色 |
圖10:使用Web網站管理工具建立用戶 |
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="Home" description="My Web Site"> <siteMapNode title="Products" roles="ProductTesters"> <siteMapNode url="~/products/product1.aspx" title="First Product" /> <siteMapNode url="~/products/product2.aspx" title="Second Product" /> </siteMapNode> <siteMapNode title="Services" roles="ServiceTesters"> <siteMapNode url="~/services/service1.aspx" title="First Service" /> <siteMapNode url="~/services/service2.aspx" title="Second Service" /> </siteMapNode> <siteMapNode url="contact.aspx" title="Contact Us" /> </siteMapNode> </siteMap> |
<siteMap defaultProvider="myprovider" enabled="true"> <providers> <add name="myprovider" type="System.Web.XmlSiteMapProvider " siteMapFile="SecurityTrimming.sitemap" securityTrimmingEnabled="true" /> </providers> |
圖11:登入頁面 |
圖12:使用安全整修 |