共用方式為


ASP.NET 主版頁面概觀

更新:2007 年 11 月

ASP.NET 主版頁面可以讓您在應用程式頁面中建立一致的配置樣式。單一主版頁面會定義應用程式中所有頁面 (或頁面群組) 的外觀和標準行為。然後,您可以建立包含想要顯示內容的個別內容頁面。當使用者要求內容頁面時,它們就會跟主版頁面合併,以產生結合主版頁面配置與內容頁面內容的輸出。

主版頁面運作方式

主版頁面實際上由兩個部分組成,主版頁面本身以及一個或多個內容頁面。

注意事項:

您也可以將主版頁面套疊。如需詳細資訊,請參閱巢狀 ASP.NET 主版頁面

主版頁面

主版頁面是副檔名為 .master 的 ASP.NET 檔案 (例如,MySite.master),其使用能夠包含靜態文字、HTML 項目和伺服器控制項的預先定義配置。主版頁面是由特殊 @ Master 指示詞識別,取代一般 .aspx 頁面使用的 @ Page 指示詞。指示詞類似下列所示。

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

@ Master 指示詞與 @ Control 指示詞能夠包含的指示詞大都相同。例如,下列主版頁面指示詞包含程式碼後置 (Code-Behind) 檔案的名稱,並指派類別名稱給主版頁面。

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

除了 @ Master 指示詞以外,主版頁面也包含頁面的所有最上層 HTML 項目,例如 html、head 和 form。例如,在主版頁面上您可以利用 HTML 表格進行配置、以 img 項目為公司標誌、在著作權注意事項上使用靜態文字,以及使用伺服器控制項建立站台的標準巡覽。您可以使用任何 HTML 和 ASP.NET 項目當做主版頁面的一部分。

可置換的內容預留位置

除了所有頁面都會顯示的靜態文字和控制項以外,主版頁面也包含一個或多個 ContentPlaceHolder 控制項。這些預留位置控制項定義了顯示可置換內容的區域。而內容頁面中則定義了可置換的內容。在定義 ContentPlaceHolder 控制項之後,主版頁面看起來可能會如下所示。

<% @ Master Language="VB" %>

<!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  >
    <title>Master page title</title>
</head>
<body>
    <form id="form1" >
        <table>
            <tr>
                <td><asp:contentplaceholder id="Main"  /></td>
                <td><asp:contentplaceholder id="Footer"  /></td>
            </tr>
        </table>
    </form>
</body>
</html>
<%@ 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  >
    <title>Master page title</title>
</head>
<body>
    <form id="form1" >
        <table>
           <tr>
               <td><asp:contentplaceholder id="Main"  /></td>
               <td><asp:contentplaceholder id="Footer"  /></td>
           </tr>
        </table>
    </form>
</body>
</html>

內容頁面

您可以建立繫結至特定主版頁面的個別 ASP.NET 內容頁面 (.aspx 檔以及選擇性的程式碼後置檔案),以定義主版頁面的預留位置控制項內容。藉由包含指向欲使用之主版頁面的 MasterPageFile 屬性,可以在內容頁面的 @ Page 指示詞中建立繫結。例如,內容頁面可能有繫結至 Master1.master 頁面的下列 @ Page 指示詞。

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

在內容頁面中,您可以加入 Content 控制項,並將其對應到主版頁面的 ContentPlaceHolder 控制項,以建立內容。例如,主版頁面可能有稱為 Main 和 Footer 的內容預留位置。在內容頁面中,您可以建立兩個 Content 控制項,其中一個對應至 ContentPlaceHolder 控制項 Main,而另一個則對應至 ContentPlaceHolder 控制項 Footer,如同下圖所示。

置換預留位置內容

在建立 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 控制項以外的其他標記(主版頁面必須包含使用屬性 的 head 項目,以便在執行階段可以合併標題設定)。

您可以建立多重主版頁面,以便為站台的各部分定義不同配置,並且為每個主版頁面定義不同的內容頁面集合。

主版頁面的優點

主版頁面具備的特色包括,開發人員習慣以反覆複製現有程式碼、文字和控制項項目的建立功能;使用框架組;使用通用檔案的 Inlcude 檔;使用 ASP.NET 使用者控制項等等。主版頁面包含下列優點:

  • 集中頁面的通用功能,讓您在一個位置就能進行更新。

  • 輕鬆建立一組控制項和程式碼,並且將結果套用至一組頁面。例如,您可以使用主版頁面上的控制項,建立套用至所有頁面的功能表。

  • 控制預留位置控制項的呈現方式,讓您可以更細膩的控制完稿頁面的配置樣式。

  • 物件模型,讓您可以從個別內容頁面自訂主版頁面。

主版頁面在執行階段的行為

在執行階段,會以下列順序處理主版頁面:

  1. 使用者輸入內容頁面的 URL 以要求頁面。

  2. 當擷取頁面時,就會讀取 @ Page 指示詞。如果指示詞參考主版頁面,則也會讀取主版頁面。如果這是第一次要求這些頁面,就會編譯所有頁面。

  3. 更新內容的主版頁面會合併至內容頁面的控制項樹狀結構。

  4. 個別 Content 控制項的內容,會合併至在主版頁面中對應的 ContentPlaceHolder 控制項。

  5. 合併後的頁面會呈現在瀏覽器中。

這個處理序如下列圖表所示。

執行階段的主版頁面

就使用者的觀點而言,合併的主版頁面與內容頁面都是單一不連續的頁面。頁面的 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 (以屬性 (Attribute) UrlPropertyAttribute 標記屬性 (Property))。在實際上,通常用來參考外部資源的 ASP.NET 伺服器控制項屬性會以這種方式標記。

其他項目

ASP.NET 無法修改不是伺服器控制項項目上的 URL。例如,如果您在主版頁面上使用 img 項目,並且將其 src 屬性設定為 URL,ASP.NET 就不會修改 URL。在這種情況下,就會在內容頁面的內容中解析 URL,並且根據它建立 URL。

一般而言,當使用主版頁面上的項目時,建議您使用伺服器控制項 (即使是不需要伺服端程式碼的項目)。例如,請使用 Image 伺服器控制項,而不是使用 img 項目。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 網頁。

請參閱

工作

HOW TO:參考 ASP.NET 主版頁面內容

HOW TO:參考 ASP.NET 主版頁面內容

概念

ASP.NET 主版和內容頁面中的事件

巢狀 ASP.NET 主版頁面