ASP.NET 2.0網站地圖搭建網站導航結構

來源:互聯網
上載者:User
asp.net|導航|網站    二、 使用SiteMap的方式

  你可以以三種常見方式來使用在前一節所建立的網站地圖檔:

  · 使用SiteMapPath控制項

  · 使用SiteMap資料來源控制項

  · 使用SiteMap類

  這個SiteMapPath控制項允許你產生breadcrumb。圖3顯示出什麼是breadcrumb。


圖3:Breadcrumb導航
  SiteMapPath控制項顯示各種層級的導航。例如,你可以點擊父或根層級以往回導航或轉到頂層。當然,你也可以定製導航層次。

  ASP.NET 2.0中還帶有一組良好的導航控制項,包括TreeView和菜單。藉助於SiteMap資料來源控制項,你可以把網站地圖檔與這些控制項綁定到一起。

  有些情況下,內建的導航控制項可能無法滿足你的要求。在這種情況中,你可以以編程方式存取這個網站地圖檔並且讀各種siteMapNode結點。然後,你可以產生一個定製的導航結構—使用siteMapNode的title和URL屬性。

   三、 使用SiteMapPath控制項

  在詳細討論細節前,讓我們首先建立我們需要的目錄結構和Web表單。首先,把兩個檔案夾Products和Services添加到網站。然後,添加一個新的Master頁面MasterPage.master。接著添加顯示在表格2中的Web表單,並且確保當你添加它們時都為其設定master頁面。

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
      表格2:Web表單列表

  現在,開啟你前面添加的Master頁面。把一個Label控制項和一個SiteMapPath控制項拖動到它上面。然後,把該Label的Text屬性設定為“Welcome!”。

  下列的列表顯示了MasterPage.master頁面中的所有標記:

<%@ 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>
  現在,從根資料夾開啟Default.aspx。Default.aspx應該看似圖4的樣子。


圖4:Default.aspx的樣本運行  為了設計這個頁面,添加一個具有4行和1列的表格。拖動一個Label控制項到最上邊一行並且設定它的Text屬性為“歡迎來到我們的網站!”。然後,拖動三個HyperLink控制項到剩下的行上,並且設定它們的Text和NavigateUrl屬性,顯示於表格3中。

HyperLink ID Text屬性 NavigateUrl屬性
HyperLink1 Products ~/products/default.aspx
HyperLink2 Services ~/Services/default.aspx
HyperLink3 Contact Us ~/contact.aspx
      表格3:設定HyperLinks的屬性

  下面的列表顯示了Default.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>
  現在,從Products檔案夾下開啟Default.aspx並且按照圖5所示來設計它。


圖5:Products檔案夾的預設頁面
  表格4列舉了在Web表單中所使用的所有超級連結。

HyperLink ID Text屬性 NavigateUrl屬性
HyperLink1 First Product ~/products/product1.aspx
HyperLink2 Second Product ~/products/product2.aspx
     表格4:Products檔案夾下Default頁面中的超級連結資訊

  遵循同樣道理,從Services檔案夾下設計Default.aspx,結果如圖6所示。


圖6.Services檔案夾的預設頁面
  表格5列舉出了使用於Web表單中的超級連結資訊。

HyperLink ID Text屬性 NavigateUrl屬性
HyperLink1 First Service ~/Services/service1.aspx
HyperLink2 Second Service ~/Services/service2.aspx
     表格5:Products檔案夾下Default頁面中的超級連結資訊

  最後,把一個標籤添加到每一個其它Web表單並且按表格6所示設定它的Text屬性。

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
     表格6:從剩下的Web表單中設定Label的Text屬性

  現在,從根資料夾下運行Default.aspx並且導航到Product1.aspx頁面。圖7顯示了Web表單的樣本運行情況。


圖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控制項

  五、 使用SiteMap類

  在SiteMapPath或TreeView控制項中顯示網站地圖資料效果太好了。然而,有時你可能需要設計定製產生邏輯。例如,你可能想開發一個定製的導航控制項—它僅為了垂直地顯示其父級。在這樣的情況下,你需要以編程方式來存取這個網站地圖檔。SiteMap類允許你準確地實現這一點。

  這個SiteMap路徑具有兩個重要的屬性:RootNode和CurrentNode。它們的類型都是SiteMapNode,並且它們都能使你分別參考網站地圖的根結點和當前結點。表格7列舉了SiteMapNode類的一些重要的屬性。

屬性 描述
ChildNodes 代表當前結點的所有子結點的集合
HasChildNodes 指示是否網站地圖結點具有子結點(true/false)
Title 返回在網站地圖檔中指定的title屬性的值
Url 返回在網站地圖檔中指定的url屬性的值
Description 返回在網站地圖檔中指定的description屬性的值
ParentNode 指出當前結點的父網站地圖結點的參考
    表格7:SiteMapNode類的一些重要的屬性

  下面的樣本使用了SiteMap路徑來存取一個網站地圖檔的單個結點。然後,以編程方式把它們添加到一個TreeView控制項。

  添加一個稱為SiteMapCustom.aspx的Web表單。然後,把一個TreeView控制項拖動到其上。把列表代碼添加到這個Web表單的Page_Load事件:

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>
  在此,你已經把認證模式設定為Forms。你還可以設定授權規則,這樣以來匿名的使用者都會被禁止存取此網站。然後,你需要啟動角色管理特徵—通過把下列標誌添加到web.config檔案中:

<roleManager enabled="true" />
  然後,從VS.NET菜單下選擇“WebSite>ASP.NET Configuration”以開啟Web網站管理工具。使用這個工具來添加兩個角色:ProductTesters和ServiceTesters(參考圖9)。當一個屬於ProductTesters角色的使用者簽入時,你只想實現把與產品相關的連結顯示在導航TreeView控制項中。同樣,當一個屬於ServiceTesters角色的使用者簽入時,應該只在TreeView中顯示與服務相關的連結。


圖9:使用Web網站管理工具添加角色
  使用Web網站管理工具建立兩個使用者,分別叫user1和user2。把user1添加到ProductTesters角色,把user2添加到ServiceTesters角色(見圖10)。


圖10:使用Web網站管理工具建立使用者
  注意:預設地,使用者和角色資訊被儲存在你的網站的App_Data檔案夾下的ASPNETDB資料庫中。這個資料庫是由ASP.NET自動建立的,如果它不存在的話。

  現在,把一個新的網站地圖檔SecurityTrimming.sitemap添加到網站並且輸入下列標記:

<?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>
  這裡的大多數標記與在web.sitemap檔案中的相同。然而,這裡有一個重要的屬性添加到了Products和Services—siteMapNodes:roles。這個roles屬性指定能夠存取這個結點及其子結點的角色。因為與產品相聯絡的連結僅顯示給屬於ProductTesters角色的使用者,你要把Products siteMapNode的roles屬性設定為ProductTesters。遵循相同的道理,你要把Services siteMapNode的roles屬性設定為ServiceTesters。不具有指定的roles屬性的siteMapNodes對於所有使用者都可存取。另外,還應注意,Products和Services結點不再具有指定的URL屬性。

  現在,你需要配置網站地圖提供者並且啟動安全整修以便SiteMap資料來源控制項能夠按照你的要求行動。把下列標記添加到web.config檔案中:

<siteMap defaultProvider="myprovider" enabled="true">
<providers>
 <add name="myprovider"
  type="System.Web.XmlSiteMapProvider "
  siteMapFile="SecurityTrimming.sitemap"
  securityTrimmingEnabled="true" />
</providers>
  在此,你添加了<siteMap>節並且指定一個指向SecurityTrimming.sitemap檔案的提供者。注意,這裡的securityTrimmingEnabled屬性被設定為true以支援安全整修。在你配置完<siteMap>節後,這個SiteMap資料來源控制項自動地從這個節中“拾取”這些設定。

  把一個稱為Login.aspx的新的web表單添加到網站上。然後,把一個Login控制項拖動到它上面並且設定它的DestinationPageUrl屬性為“~/SiteMapDataSourceDemo.aspx”。注意,你在之前已經開發了SiteMapDataSourceDemo.aspx。

  運行Login.aspx(參考圖11)並且輸入針對user1的憑證。


圖11:登入頁面
  在你成功地登入以後,你應該看見如圖12所示的TreeView。因為user1屬於ProductTesters角色,所以隱藏了與服務相聯絡的連結。


圖12:使用安全整修
  七、 總結

  網站地圖是一XML檔案—它包含你的Web網站結構的所有細節。你可以使用網站地圖檔來產生導航結構。三種使用網站地圖檔的常用方法分別是:使用SiteMapPath控制項,使用SiteMap資料來源控制項,或使用SiteMap類。你還可以使用一個特徵—稱為安全整修來支援到產生的導航連結的角色型安全性。這些控制項和類共同協助為你的Web地點建立一個專業的導航結構。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.