在ASP.NET 2.0中操作資料之三:建立主版頁面和網站導覽_自學過程

來源:互聯網
上載者:User

導言

  通常,方便使用的個人化網站都有著一致的,網站統一的頁面配置和導航體系。Asp.net 2.0引入的兩個新特性給我們在統一網站的頁面配置和網站導覽上提供了簡單而有效工具,它們是母板頁和網站導覽。母板頁允許開發人員建立統一的網站模板和指定的可編輯區域。這樣,aspx頁面只需要給模板頁中指定的可編輯區域提供填充內容就可以了,所有在母板頁中定義的其他標記將出現在所有使用了該母板頁的aspx頁面中。這種模式允許開發人員可以統一的管理和定義網站的頁面配置,因此可以容易的得到擁有統一的視覺和感覺的頁面並且還易於更新。

  網站導覽系統允許開發人員定義網站地圖並提供了API以便通過程式查詢網站地圖資訊。新的導航控制項包括Menu,TreeView和SiteMapPath,這樣可以很容易的在一個一般的導航使用者介面元素裡呈現全部或者部分網站地圖。我們將使用預設的網站導覽提供者,這意味著我們的網站地圖將定義在一個xml格式的檔案中。

  為說明這些觀念並且使我們的教程的樣本網站可用性更佳,讓我們通過本次課程定義一個網站統一的頁面配置,實現一個網站地圖,並且添加導航UI。在這個課程結束時我們的課程樣本網站就擁有一個優美的設計效果了。

圖1:本課程的最終成果

步驟1:建立母板頁

  第一步是為我們的網站建立母板頁。到目前為止我們的網站只有一個類型化的DataSet(Northwind.xsd,位於App_Code檔案夾),商務邏輯層類庫(ProductsBLL.cs,CategoriesBLL.cs等等,這些都在App_Code檔案夾裡),資料庫(NORTHWIND.MDF,位於App_Data檔案夾),設定檔(web.config),和一個CSS檔案(Style.css)。
我整理這些頁面和檔案以說明前面兩次課程中介紹的資料訪問層和商務邏輯層將會在以後課程的更多細節中重用這些樣本。

圖2:我們項目中的檔案

  要建立一個母板頁,用右鍵點擊解決方案管理器中的項目名稱並選擇添加新項。然後從模板列表視窗中選擇母板類型並且命名為Site.master

圖3:添加一個母板頁到網站中

  在母板頁中定義網站統一的頁面配置。你可以用設計檢視定義你需要的布局或者控制項,你還可以手動的在程式碼檢視中委任標記。在我們的母板頁中使用了定義在外部檔案Style.css中的層疊樣式表來定義位置和風格。也許你不知道下面這些標記怎樣顯示,樣式表規則定義了導航用的<div>標籤中的內容絕對位置在頁面的左邊並且寬度固定為200像素。

Site.master

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"> <title>Working with Data Tutorials</title> <link href="Styles.css" rel="stylesheet" type="text/css" /></head><body> <div id="wrapper"> <form id="form1" runat="server">  <div id="header">  <span class="title">Working with Data Tutorials</span>  <span class="breadcrumb">   TODO: Breadcrumb will go here...</span>  </div>  <div id="content">  <asp:contentplaceholder id="MainContent"   runat="server">   <!-- Page-specific content will go here... -->  </asp:contentplaceholder>  </div>  <div id="navigation">  TODO: Menu will go here...  </div> </form> </div></body></html>

  一個母板頁定義了固定的布局和可以被那些使用了母板頁的aspx頁面填充的可編輯區域
這個可編輯區域是通過ContentPlaceHolder控制項顯示,位於<div>標記中。我們的母板頁中只有一個ContentPlaceHolder(MainContent),但是母板頁中是可以包含多個ContentPlaceHolder控制項的。

  輸入上面的標記,切換到設計檢視觀察母板頁的布局。所有的使用了這個母板頁的aspx頁面都會有這樣統一的布局,而MainContent地區是留給aspx頁面展現自己才華的地方。

圖4:在設計檢視中顯示的母板頁

步驟2:給網站添加一個首頁

  定義母板頁後,我們準備給網站添加一些aspx頁面。讓我們從添加我們的首頁Degault.aspx開始吧。在解決方案管理器中右鍵點擊項目名稱並且選擇添加建立項目。從模板列表中選擇Web Form選項並且命名為Default.aspx。並且,勾上“選擇母板頁”的複選框。

圖5:添加一個新Web Form並且勾上“選擇母板頁”的複選框

點擊確定按鈕後,將會詢問你建立的這個aspx頁面使用哪個母板頁。也許你有多個母板頁在你的項目中,但是我們只有一個。

圖6:選擇你要使用的母板頁

選擇母板頁後,建立的aspx會包含下面這些標記:

Default.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %><asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server"></asp:Content>

  在@Page指令中有一個指向母板頁的引用(MasterPageFile=”~/Site.master”),並且aspx頁面的標記中包含了一個Content控制項對應母板頁中定義的ContentPlaceHolder控制項,這個Content控制項的ContentPlaceHolderID屬性對應到指定的ContentPlaceHolder控制項。你可以在Content控制項中放置你想顯示在相應ContentPlaceHolder控制項位置的標記。

設定@Page指令的Title屬性為Home並且添加一些歡迎詞到Content控制項中:

Default.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Home" %><asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server"> <h1>Welcome to the Working with Data Tutorial Site</h1> <p>This site is being built as part of a set of tutorials thatillustrate some of the new data access and databinding features inASP.NET 2.0 and Visual Web Developer.</p> <p>Over time, it will include a host of samples thatdemonstrate:</p> <ul> <li>Building a DAL (data access layer),</li> <li>Using strongly typed TableAdapters and DataTables</li> <li>Master-Detail reports</li> <li>Filtering</li> <li>Paging,</li> <li>Two-way databinding,</li> <li>Editing,</li> <li>Deleting,</li> <li>Inserting,</li> <li>Hierarchical data browsing,</li> <li>Hierarchical drill-down,</li> <li>Optimistic concurrency,</li> <li>And more!</li> </ul></asp:Content>

@Page指令中的Title屬性允許我們可以在aspx頁面定義標題,即使母板頁中已經定義了<title>元素。我們還可以使用Page.Title的編程方式設定頁面的標題。需要注意的是母板頁中引用的樣式表(如Style.css)會自動校正以應用到每個aspx頁面中,這是與aspx頁面的目錄和母板頁目錄之間的關係無關。

  切換到設計檢視我們會看到我們的頁面將在瀏覽器中的顯示效果。注意:在設計檢視裡,aspx頁面的內容只有可編輯區域可以被修改,在母板頁定義的非ContentPlaceHolder部分標記被顯示成灰色。

圖7:在設計檢視中顯示的可編輯區域及非可編輯區域

  當Default.aspx頁面被瀏覽器訪問時,asp.net引擎會合并母板頁的內容和aspx頁的內容,並且將合并的內容呈現為最終的HTML發送到瀏覽器。當母板頁的內容被更新,所有使用了這個母板頁的aspx頁面會在下次被請求時重新和新的母板頁內容合并。簡單的說,母板頁模型允許定義一個統一的布局模板(母板頁),當它改變時整個網站會反應這種改變。
添加更多的頁面到網站中
讓我們花一點時間添加另外的頁面到網站中,以便支援最終的各種各樣的課程的樣本。這裡總共會有超過35個樣本,所以我們先建立一部分。以後會有很多類別的樣本,為了更好的管理這些樣本我們給每個分類添加一個檔案夾。現在我們添加三個檔案夾:
· BasicReporting
· Filtering
· CustomFormatting
最後,如圖8所示向解決方案管理器中添加新檔案。每添加一個檔案的時候記住要勾上“選擇母板頁”的複選框。

圖8:添加下列檔案

第三步:添加網站地圖

  管理一個由大量網頁組成的網站的其中一個挑戰是要為訪問者瀏覽網站提供一個捷徑。作為開始,網站的導航結構必須被定義。下一步,這個結構必須轉換成適於導航的使用者介面元素,比如菜單或者位置導航。當有新頁面添加到網站和已有的頁面被移除的時候這個過程將要修改和校正。

  在asp.net 2.0以前,開發人員需要自己建立網站導覽結構,維護它並且將它轉化為適於導航的使用者介面元素。在asp.net 2.0裡,開發人員可以利用非常靈活的且內建的網站導覽系統。Asp.net 2.0網站導覽系統允許開發人員定義一個網站地圖並且提供了可以訪問這些資訊的API。

  預設的Asp.net網站地圖提供者期望網站地圖資訊儲存在xml格式的檔案中。但是,建立在提供者模型上的網站導覽系統是可以被擴充的以支援多種方式儲存的網站地圖。Jeff Prosise的文章,The SQL Site Map Provider You've Been Waiting For展示了怎樣建立將網站地圖儲存在SQL Server資料庫裡的提供者;另外一個選擇是基於檔案系統的網站地圖提供者。
在這個指南中,我們仍然使用ASP.NET2.0裡預設的網站地圖提供者。要建立網站地圖,在解決方案管理器裡右鍵點擊項目名稱,選擇添加新項,然後選擇網站地圖類型。命名為Web.sitemap然後單擊添加按鈕。

圖9:向你的項目中添加網站地圖

  網站地圖檔是一個xml檔案。注意:Visual Studio可以為網站地圖結構提供智能感知。網站地圖檔必須含有<siteMap>作為根節點,它必須至少含有一個<siteMapNode>子節點。這個<siteMapNode>元素又可以包含任意數量的<siteMapNode>子項目。

  網站地圖類比了檔案系統。為每個檔案夾添加一個<siteMapNode>元素,並且為每個aspx頁面添加一個<siteMapNode>子項目,如此:

Web.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="Home"> <siteMapNode title="Basic Reporting" url="~/BasicReporting/Default.aspx" description="Basic Reporting Samples"> <siteMapNode url="~/BasicReporting/SimpleDisplay.aspx"  title="Simple Display"  description="Displays the complete contents  of a database table." /> <siteMapNode url="~/BasicReporting/DeclarativeParams.aspx"  title="Declarative Parameters"  description="Displays a subset of the contents  of a database table using parameters." /> <siteMapNode url="~/BasicReporting/ProgrammaticParams.aspx"  title="Setting Parameter Values"  description="Shows how to set parameter values  programmatically." /> </siteMapNode> <siteMapNode title="Filtering Reports" url="~/Filtering/Default.aspx" description="Samples of Reports that Support Filtering"> <siteMapNode url="~/Filtering/FilterByDropDownList.aspx"  title="Filter by Drop-Down List"  description="Filter results using a drop-down list." /> <siteMapNode url="~/Filtering/MasterDetailsDetails.aspx"  title="Master-Details-Details"  description="Filter results two levels down." /> <siteMapNode url="~/Filtering/DetailsBySelecting.aspx"  title="Details of Selected Row"  description="Show detail results for a selected item in a GridView." /> </siteMapNode> <siteMapNode title="Customized Formatting"  url="~/CustomFormatting/Default.aspx"  description="Samples of Reports Whose Formats are Customized"> <siteMapNode url="~/CustomFormatting/CustomColors.aspx"  title="Format Colors"  description="Format the grid s colors based  on the underlying data." /> <siteMapNode  url="~/CustomFormatting/GridViewTemplateField.aspx"  title="Custom Content in a GridView"  description="Shows using the TemplateField to  customize the contents of a field in a GridView." /> <siteMapNode  url="~/CustomFormatting/DetailsViewTemplateField.aspx"  title="Custom Content in a DetailsView"  description="Shows using the TemplateField to customize  the contents of a field in a DetailsView." /> <siteMapNode url="~/CustomFormatting/FormView.aspx"  title="Custom Content in a FormView"  description="Illustrates using a FormView for a  highly customized view." /> <siteMapNode url="~/CustomFormatting/SummaryDataInFooter.aspx"  title="Summary Data in Footer"  description="Display summary data in the grids footer." /> </siteMapNode> </siteMapNode></siteMap>

網站地圖定義了這個網站的導航結構,它是階層的以便描述網站中各種各樣的地區。在Web.sitemap中的每個<siteMapNode>元素描述了一個網站結構中的一個地區。

圖10:網站地圖描述了一個層次的導航結構

  Asp.net通過DotNET 架構中的SiteMap類顯示網站地圖的結構。這個類有一個CurrentNode屬性,它返回目前使用者正在訪問的節點的資訊;RootNode屬性返回網站地圖的根節點資訊(在我們的網站地圖中是Home)。CurrentNode呵RootNode屬性都返回SiteMapNode執行個體,SiteMapNode包含ParentNode,ChildNodes,NextSibling,PreviousSibling等屬性,這些屬性允許網站地圖的層次可以被遍曆。

步驟4:利用網站地圖顯示菜單

  在asp.net 2.0中我們可以像asp.net 1.x一樣,有多種編程方式可以訪問資料,還可以通過新的資料來源控制項訪問。
這裡有多個內建的資料來源控制項,比如用來訪問關聯式資料庫資料的SqlDataSource控制項,用來訪問類所提供的資料的ObjectDataSoruce控制項等等。你還可以建立你自己的自訂資料來源控制項。

  資料來源控制項作為你的aspx頁面和底層資料的代理。為了顯示資料來源控制項查詢到的資料,我們要添加其他Web控制項到頁面上,並且將它和資料來源控制項綁定。要綁定一個Web控制項到一個資料來源控制項,只需要簡單的設定這個Web控制項的DataSourceID屬性值為資料來源控制項的ID屬性值。

  為了擷取網站地圖中的資料,asp.net提供了SiteMapDataSource控制項,它允許我們綁定一個Web控制項來顯示我們的網站地圖。TreeView和Menu這兩個Web控制項常常用來提供導航使用者介面。要綁定網站地圖中的資料到這兩個控制項,添加一個SiteMapDataSource控制項到頁面中,設定TreeView或者Menu控制項的DataSourceID屬性值為SiteMapDataSource控制項的ID屬性值就可以了。舉個例子,我們可以用下面這些標記將Menu控制項到母板頁中:

<div id="navigation"> <asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1"> </asp:Menu> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" /></div>

為了產生最佳化的HTML,我們可以綁定SiteMapDataSource控制項到Repeater控制項,如下:

<div id="navigation"> <ul> <li><asp:HyperLink runat="server" ID="lnkHome"  NavigateUrl="~/Default.aspx">Home</asp:HyperLink></li> <asp:Repeater runat="server" ID="menu"  DataSourceID="SiteMapDataSource1">  <ItemTemplate>  <li>   <asp:HyperLink runat="server"   NavigateUrl='<%# Eval("Url") %>'>   <%# Eval("Title") %></asp:HyperLink>  </li>  </ItemTemplate> </asp:Repeater> </ul> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" /></div>

  SiteMapDataSource控制項每次返回網站地圖層次中的一級,從網站地圖中的根節點開始(在我們的網站地圖中是Home),然後是下一個級(Basic Reporting,Filtering Reports和Customized Formatting)等等。
當將SiteMapDataSource綁定到Repeater時,它遍曆第一級並且用ItemTemplate顯示第一級的每個SiteMapNode執行個體。我們可以使用Eval(屬性名稱)訪問SiteMapNode的細節,這樣我們就可以得到SiteMapNode的Url和Title屬性給HyperLink控制項。
下面顯示的是上面使用Repeater控制項例子產生的HTML標記:

<li> <a href="/Code/BasicReporting/Default.aspx">Basic Reporting</a></li><li> <a href="/Code/Filtering/Default.aspx">Filtering Reports</a></li><li> <a href="/Code/CustomFormatting/Default.aspx"> Customized Formatting</a></li>

  從上面可以看出,網站地圖的第二級節點(Basic Reporting,Filtering Reports和Customized Formatting)被顯示而不是第一個。

  這是因為SiteMapDataSource控制項的ShowStartingNode屬性被設為false,導致SiteMapDataSource跳過了網站地圖的根節點取而代之的是從網站地圖的層次的第二級開始返回資訊。
為了顯示Basic Reporting,Filtering Reports和Customized Formatting的子SiteMapNode,我們可以向先前的Repeater的ItemTemplate裡添加另外一個Repeater。第二個Repeater將綁定到SiteMapNode執行個體的子結點屬性,如下:

<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1"> <ItemTemplate> <li>  <asp:HyperLink runat="server"  NavigateUrl='<%# Eval("Url") %>'>  <%# Eval("Title") %></asp:HyperLink>  <asp:Repeater runat="server"  DataSource='<%# ((SiteMapNode) Container.DataItem).ChildNodes %>'>  <HeaderTemplate>   <ul>  </HeaderTemplate>  <ItemTemplate>   <li>   <asp:HyperLink runat="server"    NavigateUrl='<%# Eval("Url") %>'>    <%# Eval("Title") %></asp:HyperLink>   </li>  </ItemTemplate>  <FooterTemplate>   </ul>  </FooterTemplate>  </asp:Repeater> </li> </ItemTemplate></asp:Repeater>

這兩個Repeater產生的HTML標記(為了節省篇幅一些標記被移除了):

<li> <a href="/Code/BasicReporting/Default.aspx">Basic Reporting</a> <ul> <li>  <a href="/Code/BasicReporting/SimpleDisplay.aspx">  Simple Display</a> </li> <li>  <a href="/Code/BasicReporting/DeclarativeParams.aspx">  Declarative Parameters</a> </li> <li>  <a href="/Code/BasicReporting/ProgrammaticParams.aspx">  Setting Parameter Values</a> </li> </ul></li><li> <a href="/Code/Filtering/Default.aspx">Filtering Reports</a> ...</li><li> <a href="/Code/CustomFormatting/Default.aspx"> Customized Formatting</a> ...</li>

使用的CSS風格選擇自Rachel Andrew的書:The CSS Anthology: 101 Essential Tips, Tricks, & Hacks,<ul>和<li>元素的風格將顯示如下:

圖11:用兩個Repeater和一些CSS顯示的菜單

  這個菜單在母板頁中定義的,綁定了在Web.sitemap中定義的網站地圖,這意味著所有網站地圖的修改會立即反應到所有使用了Site.master母板頁的頁面。

關掉檢視狀態

  所有的asp.net控制項可以隨意的保持它們的狀態到View State(譯註:當原文中採用的是開頭字母大寫的ViewState將不翻譯)中,最終產生HTML時它被系列化並儲存在一個隱藏的表單域中。控制項用ViewState來記憶它們在頁面返回時被程式改變的狀態,比如Web控制項繫結資料。如果檢視狀態允許資訊可以在頁面返回時保持,它會增大發送到用戶端HTML代碼的尺寸,如果在沒有確切的監控下會使頁面膨脹得很厲害。資料顯示控制項-尤其是GridView控制項-會顯著地增加大量的額外的標記到頁面中。當然,這些增長可能對寬頻使用者毫無影響,但是檢視狀態會給撥接的使用者增加幾秒鐘的延遲。

  要觀察檢視狀態的影響,在瀏覽器裡開啟這個頁面然後查看頁面的原始碼(對於Internet Explorer,點擊”查看”菜單並且選擇原始碼選項)。你還可以開啟頁面跟蹤選項以觀察這個頁面上每個控制項的檢視狀態。檢視狀態的資訊被系列化並放在位於跟隨在<form>標籤後面的<div>元素裡的名為_VIEWSTATE的隱藏表單域中。

  檢視狀態只在頁面上使用了Form時才會被保持;如果你的aspx頁面沒有包含
<form runat=”server”>的聲明,那麼最後產生的HTML標記中將不含有VIEWSTATE隱藏表單域。

母板頁產生的VIEWSTATE隱藏表單域大概有1800個位元組。這些額外的資料主要是SiteMapDataSource控制項為Repeater控制項提供的資料內容產生的。也許1800位元組左右看起來還不算很多,但是使用了GridView並且使用了很多欄位和記錄的檢視狀態很容易就膨脹10倍或更多。

  可以將EnableViewState屬性設為false在頁面級或者控制項級關閉檢視狀態,從而可以減少產生的標記的大小。Web控制項利用檢視狀態在頁面返回時保持要綁定到資料顯示控制項的資料,當關閉了資料顯示控制項的檢視狀態後,在每次頁面返回時都必須重新綁定資料到控制項。在asp.net 1.x的時候這個職責落到開發人員身上;在asp.net 2.0裡,頁面返回時,資料顯示控制項會在必要的時候重新綁定資料。

  設定Repeater控制項的EnableViewState為false可以減少頁面的檢視狀態。可以通過屬性視窗設定或者在程式碼檢視裏手動修改。通過這些改變,Repeater標記將會像這樣:

<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1" EnableViewState="False"> <ItemTemplate> ... <i>ItemTemplate contents omitted for brevity</i> ... </ItemTemplate></asp:Repeater>

  經過這些變化,頁面產生的檢視狀態減少到52個位元組,減少了97%的檢視狀態資料!在這個指南系列裡我會關閉所有資料控制項的檢視狀態以減少產生標記的大小。在大多數例子裡會在沒有提示的情況下將EnableViewState屬性設為false。

  僅有當資料Web控制項必須開啟它的檢視狀態才能提供期望的功能的情況下我們才討論。

步驟5:添加breadcrumb導航

  為完成母板頁,讓我們給每個頁面添加一個breadcrumb導航UI元素。breadcrum導航會快速的顯示使用者當前在網站中的位置。添加一個breadcrumb導航在asp.net 2.0中是簡單的-只要添加一個SiteMapPath控制項到頁面上就可以了;不需要更多的代碼。
在我們的網站中,添加這個控制項到頭部的<div>標籤中:

<span class="breadcrumb"> <asp:SiteMapPath ID="SiteMapPath1" runat="server"> </asp:SiteMapPath></span>

breadcrum導航控制項顯示了使用者當前訪問的頁面以及它的父級節點,直至到根節點(在我們的網站地圖中是Home)。

圖12:利用位置導航控制項顯示在網站地圖層次中的當前頁面及其父頁面

步驟6:給每個部分添加預設頁面

  在我們的網站中這個課程被分成不同的分類-Basic Reporting,Filtering,Custom Formatting等等-每個分類有一個檔案夾並且有對應課程的aspx頁面。並且,每個檔案夾裡包含一個Default.aspx頁面。在這個預設頁面中,將顯示這個部分的所有課程。比如,我們可以通過BasicReporting檔案夾裡的Default.aspx頁面串連到SimpleDisplay.aspx,DeclarativeParams.aspx和ProgrammaticParams.aspx。這裡,我們可以再次使用SiteMap類和一個資料顯示控制項顯示定義在Web.sitemap檔案內的網站地圖的資訊。

讓我們再次使用Repeater顯示一個無序列表,不過這次我們會顯示指南的標題和描述。我們需要在每個Default.aspx頁面重複這些標記和代碼,我們可以將這個UI邏輯封裝成一個User Control。在網站中添加一個名為UserControls的檔案夾並添加一個名為SectionLevelTutorialListing.ascx的Web使用者控制項,它包含一下標記:

圖13:向UserControls檔案夾裡添加新Web使用者控制項

SectionLevelTutorialListing.ascx

<%@ Control Language="CS" AutoEventWireup="true" CodeFile="SectionLevelTutorialListing.ascx.cs" Inherits="UserControls_SectionLevelTutorialListing" %><asp:Repeater ID="TutorialList" runat="server" EnableViewState="False"> <HeaderTemplate><ul></HeaderTemplate> <ItemTemplate> <li><asp:HyperLink runat="server"  NavigateUrl='<%# Eval("Url") %>'  Text='<%# Eval("Title") %>'></asp:HyperLink>  - <%# Eval("Description") %></li> </ItemTemplate> <FooterTemplate></ul></FooterTemplate></asp:Repeater>

SectionLevelTutorialListing.ascx.cs

using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;public partial class UserControls_SectionLevelTutorialListing : UserControl{ protected void Page_Load(object sender, EventArgs e) { // If SiteMap.CurrentNode is not null, // bind CurrentNode ChildNodes to the GridView if (SiteMap.CurrentNode != null) {  TutorialList.DataSource = SiteMap.CurrentNode.ChildNodes;  TutorialList.DataBind(); } }}

  在前面的Repeater例子中我將SiteMap的資料繫結到Repeater上;當然,這個SectionLevelTutorialListing使用者控制項也將使用這種方法。在Page_Load事件裡,有一個檢測程式以確保這是否是第一次訪問該頁面(不是返回)並且這個頁面的URL要映射到網站地圖中的一個節點。如果頁面使用了這個使用者控制項,那麼就沒有對應的
<siteMapNode>,SiteMap.CurrentNode會返回null並且將沒有資料繫結到Repeater控制項。假設我們有一個CurrentNode,我可以將它的ChildNodes集合綁定到這個Repeater。每個部分的Default.aspx頁面是這個部分內教程的父節點,這些代碼會展示每個部分內教程的串連和描述,下面是螢幕截圖:
一旦這個Repeater建立好後,在設計檢視裡開啟每個檔案夾的Default.aspx頁面,將這個使用者控制項拖到你要顯示的地方。

圖14:使用者控制項已經添加到Default.aspx頁面上

圖15:Basic Reporting指南的列表

總結

完成網站地圖和母板頁後,現在我們的教程網站擁有統一的頁面配置和導航體系。儘管我們的網站有很多頁面,但是我們可以集中的更新網站頁面配置和網站導覽資訊。明確一點,頁面配置資訊在母板頁Site.master中定義,網站地圖在Web.sitemap中定義。我們不需要寫任何代碼就完成了網站頁面配置和導航機制,Visual Studio提供了所見即所得 (WYSIWYG)的設計時支援。
完成了資料訪問層和商務邏輯層並且定義了一個統一的頁面配置和網站導覽系統,下一步我們將探索通用報表模式。在接下來的三個指南裡我們將會看到基本報表任務-用GridView,DetailsView和FormView控制項顯示從商務邏輯層擷取的資料。

祝編程快樂!

作者簡介

Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創始人,自1998年以來一直應用微軟Web技術。Scott是個獨立的技 術諮詢顧問,培訓師,作家,最近完成了將由Sams出版社出版的新作,24小時內精通ASP.NET 2.0。他的聯絡電郵為mitchell@4guysfromrolla.com,也可以通過他的部落格http://ScottOnWriting.NET與他聯絡。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.