ASP.NET 母版頁概述

使用 ASP.NET 母版頁可以爲應用程序中的頁創建一致的佈局。單個母版頁可以爲應用程序中的所有頁(或一組頁)定義所需的外觀和標準行爲。然後可以創建包含要顯示的內容的各個內容頁。當用戶請求內容頁時,這些內容頁與母版頁合併以將母版頁的佈局與內容頁的內容組合在一起輸出。

母版頁的工作原理

母版頁實際由兩部分組成,即母版頁本身與一個或多個內容頁。

Note注意

您也可以嵌套母版頁。有關詳細信息,請參見嵌套的 ASP.NET 母版頁

母版頁

母版頁爲具有擴展名 .master(如 MySite.master)的 ASP.NET 文件,它具有可以包括靜態文本、HTML 元素和服務器控件的預定義佈局。母版頁由特殊的 @ Master 指令識別,該指令替換了用於普通 .aspx 頁的 @ Page 指令。該指令類看起來類似下面這樣。

<%@ Master Language="C#" %>

@ Master 指令可以包含的指令與 @ Control 指令可以包含的指令大多數是相同的。例如,下面的母版頁指令包括一個代碼隱藏文件的名稱並將一個類名稱分配給母版頁。

<%@ Master Language="C#" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

除 @ Master 指令外,母版頁還包含頁的所有頂級 HTML 元素,如 htmlhead 和 form。例如,在母版頁上可以將一個 HTML 表用於佈局、將一個 img 元素用於公司徽標、將靜態文本用於版權聲明並使用服務器控件創建站點的標準導航。您可以在母版頁中使用任何 HTML 元素和 ASP.NET 元素。

可替換內容佔位符

除會在所有頁上顯示的靜態文本和控件外,母版頁還包括一個或多個 ContentPlaceHolder 控件。這些佔位符控件定義可替換內容出現的區域。接着在內容頁中定義可替換內容。定義 ContentPlaceHolder 控件後,母版頁可能看起來類似於下面這樣。

<%@ Master Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 
    1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server" >
    <title>Master page title</title>
</head>
<body>
    <form id="form1" runat="server">
        <table>
           <tr>
               <td><asp:contentplaceholder id="Main" runat="server" /></td>
               <td><asp:contentplaceholder id="Footer" runat="server" /></td>
           </tr>
        </table>
    </form>
</body>
</html>

內容頁

通過創建各個內容頁來定義母版頁的佔位符控件的內容,這些內容頁爲綁定到特定母版頁的 ASP.NET 頁(.aspx 文件以及可選的代碼隱藏文件)。通過包含指向要使用的母版頁的 MasterPageFile 屬性,在內容頁的 @ Page 指令中建立綁定。例如,一個內容頁可能包含下面的 @ Page 指令,該指令將該內容頁綁定到 Master1.master 頁。

<%@ Page Language="C#" MasterPageFile="~/MasterPages/Master1.master" Title="Content Page"%>

在內容頁中,通過添加 Content 控件並將這些控件映射到母版頁上的 ContentPlaceHolder 控件來創建內容。例如,母版頁可能包含名爲 Main 和Footer 的內容佔位符。在內容頁中,可以創建兩個 Content 控件,一個映射到 ContentPlaceHolder 控件 Main,而另一個映射到ContentPlaceHolder 控件 Footer,如下面的圖中所示。

替換佔位符內容

MasterPagesMerge 圖形

創建 Content 控件後,向這些控件添加文本和控件。在內容頁中,Content 控件外的任何內容(除服務器代碼的腳本塊外)都將導致錯誤。在 ASP.NET 頁中所執行的所有任務都可以在內容頁中執行。例如,可以使用服務器控件和數據庫查詢或其他動態機制來生成 Content 控件的內容。

內容頁可能看起來與下面類似。

<% @ Page Language="VB" MasterPageFile="~/Master.master" Title="Content Page 1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
    Main content.
</asp:Content>
    
<asp:Content ID="Content2" ContentPlaceHolderID="Footer" Runat="Server" >
    Footer content.
</asp:content>

[C#]

<% @ Page Language="C#" MasterPageFile="~/Master.master" Title="Content Page 1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
    Main content.
</asp:Content>
    
<asp:Content ID="Content2" ContentPlaceHolderID="Footer" Runat="Server" >
    Footer content.
</asp:content>

@ Page 指令將內容頁綁定到特定的母版頁,併爲要合併到母版頁中的頁定義標題。注意,內容頁包含的所有標記都在 Content 控件中。(母版頁必須包含一個具有屬性 runat="server" 的 head 元素,以便可以在運行時合併標題設置。)

可以創建多個母版頁來爲站點的不同部分定義不同的佈局,並可以爲每個母版頁創建一組不同的內容頁。

母版頁的優點

母版頁提供了開發人員已通過傳統方式創建的功能,這些傳統方式包括重複複製現有代碼、文本和控件元素;使用框架集;對通用元素使用包含文件;使用 ASP.NET 用戶控件等。母版頁具有下面的優點:

  • 使用母版頁可以集中處理頁的通用功能,以便可以只在一個位置上進行更新。

  • 使用母版頁可以方便地創建一組控件和代碼,並將結果應用於一組頁。例如,可以在母版頁上使用控件來創建一個應用於所有頁的菜單。

  • 通過允許控制佔位符控件的呈現方式,母版頁使您可以在細節上控制最終頁的佈局。

  • 母版頁提供一個對象模型,使用該對象模型可以從各個內容頁自定義母版頁。

母版頁的運行時行爲

在運行時,母版頁是按照下面的步驟處理的:

  1. 用戶通過鍵入內容頁的 URL 來請求某頁。

  2. 獲取該頁後,讀取 @ Page 指令。如果該指令引用一個母版頁,則也讀取該母版頁。如果這是第一次請求這兩個頁,則兩個頁都要進行編譯。

  3. 包含更新的內容的母版頁合併到內容頁的控件樹中。

  4. 各個 Content 控件的內容合併到母版頁中相應的 ContentPlaceHolder 控件中。

  5. 瀏覽器中呈現得到的合併頁。

下面的關係圖對此過程進行了闡釋。

運行時的母版頁

MasterPagesMerge 圖形

從用戶的角度來看,合併的主控和內容頁是一個單獨而離散的頁。該頁的 URL 是內容頁的 URL。

從編程的角度來看,這兩個頁用作其各自控件的獨立容器。內容頁用作母版頁的容器。但是,在內容頁中可以從代碼中引用公共母版頁成員(如下一節中所述)。

注意,母版頁成爲了內容頁的一部分。實際上,母版頁與用戶控件的作用方式大致相同 -- 作爲內容頁的一個子級並作爲該頁中的一個容器。但是在這種情況下,母版頁是所有呈現到瀏覽器中的服務器控件的容器。合併的主控和內容頁的控件樹看起來類似於下面這樣:

Page
    Master Page
        (Master page markup and controls)
        ContentPlaceHolder
            Content page markup and server controls
        (Master page markup and controls)
        ContentPlaceHolder
            Content page markup and server controls
        (Master page markup and controls)

此關係圖是簡化的;如果內容頁不具有相應的 Content 控件,母版頁也可能在 ContentPlaceholder 控件中具有標記和控件。

一般說來,此結構對如何構造頁或編寫頁的程序無任何影響。但是在某些情況下,如果在母版頁上設置一個頁範圍的屬性,則該屬性可能會影響內容頁的行爲,這是因爲母版頁是頁上控件的最近的父級。例如,如果在內容頁上將 EnableViewState 屬性設置爲 true,而在母版頁中將相同的屬性設置爲false,實際上會禁用視圖狀態,因爲母版頁上的設置具有優先權。

母版頁和內容頁路徑

當請求某個內容頁時,其內容與母版頁合併,並且該頁在內容頁的上下文中運行。例如,如果獲取 HttpRequest 對象的 CurrentExecutionFilePath屬性,則無論是在內容頁代碼還是母版頁代碼中,路徑都表示內容頁的位置。

母版頁和內容頁不必位於同一文件夾中。只要內容頁的 @ Page 指令中的 MasterPageFile 屬性解析爲一個 .master 頁,ASP.NET 就可以將內容頁和母版頁合併爲一個單獨的已呈現的頁。

引用外部資源

內容頁和母版頁都可以包含引用外部資源的控件和元素。例如,兩者都可以包含引用圖像文件的圖像控件,或包含引用其他頁的定位點。

合併的內容和母版頁的上下文是內容頁的上下文。這會影響在定位點上指定資源(如圖像文件和目標頁)的 URL 的方式。

服務器控件

在母版頁上的服務器控件中,ASP.NET 動態修改引用外部資源的屬性的 URL。例如,可以將一個 Image 控件放置於一個母版頁上並將其 ImageUrl屬性設置爲相對於母版頁。在運行時,ASP.NET 會修改 URL 以便其在內容頁的上下文中正確解析。

ASP.NET 會在下面的情況下修改 URL:

  • URL 爲某個 ASP.NET 服務器控件的屬性。

  • 該屬性在該控件中內部標記爲一個 URL。(該屬性 (Property) 用屬性 (Attribute) UrlPropertyAttribute 來標記。)在實際情況中,採用這種方式標記通常用於引用外部資源的 ASP.NET 服務器控件屬性。

其他元素

ASP.NET 無法修改不是服務器控件的元素上的 URL。例如,如果在母版頁上使用一個 img 元素並將其 src 屬性設置爲一個 URL,則 ASP.NET 不會修改該 URL。在這種情況下,URL 會在內容頁的上下文中進行解析並創建相應的 URL。

一般說來,在母版頁上使用元素時,建議您使用服務器控件,即使是對不需要服務器代碼的元素也是如此。例如,不使用 img 元素,而使用 Image服務器控件。這樣,ASP.NET 就可以正確解析 URL,而且您可以避免移動母版頁或內容頁時可能引發的維護問題。

有關指定 ASP.NET 服務器控件的路徑的更多信息,請參見 ASP.NET 網站路徑

母版頁與主題

不能直接將 ASP.NET 主題應用於母版頁。如果向 @ Master 指令添加一個主題屬性,則頁在運行時會引發錯誤。

但是,主題在下面這些情況中會應用於母版頁:

  • 如果主題是在內容頁中定義的。母版頁在內容頁的上下文中解析,因此內容頁的主題也會應用於母版頁。

  • 如果通過在 pages 元素(ASP.NET 設置架構) 元素中包含主題定義來將整個站點配置爲使用主題。

有關更多信息,請參見 ASP.NET 主題和外觀概述

限定母版頁的範圍

可以在三種級別上將內容頁附加到母版頁:

  • 頁級   可以在每個內容頁中使用頁指令來將內容頁綁定到一個母版頁,如下面的代碼示例中所示。

    <%@ Page Language="VB" MasterPageFile="MySite.Master" %> 
    

    <%@ Page Language="C#" MasterPageFile="MySite.Master" %> 
    
  • 應用程序級   通過在應用程序的配置文件 (Web.config) 的 pages 元素中進行設置,可以指定應用程序中的所有 ASP.NET 頁(.aspx 文件)都自動綁定到一個母版頁。該元素可能看起來類似於下面這樣。

    <pages masterPageFile="MySite.Master" />
    

    如果使用此策略,則應用程序中的所有具有 Content 控件的 ASP.NET 頁都與指定的母版頁合併。(如果某個 ASP.NET 頁不包含 Content 控件,則不應用該母版頁。)

  • 文件夾級   此策略類似於應用程序級的綁定,不同的是隻需在一個文件夾中的一個 Web.config 文件中進行設置。然後母版頁綁定會應用於該文件夾中的 ASP.NET 頁。

發佈了27 篇原創文章 · 獲贊 36 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章