ASP.NET/MasterPageFile

簡介

編輯

普通網頁如果以這樣的代碼行開始:

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

這是使用一個外圍框架頁面。具體的外圍框架頁面文件由MasterPageFile設定。

外圍框架頁面文件的擴展名為.master,是一個由特殊的 @ Master 指令識別的ASP.NET 文件,如:

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

用法

編輯

指定要使用的master page

編輯

在Visual Studio的ASP.NET的項目中,選擇創建新項目(item),然後選擇創建MasterPage。其中head與body中<asp:ContentPlaceHolder />定義空位。如:

    <asp:ContentPlaceHolder id="head" runat="server">
    </asp:ContentPlaceHolder>

創建普通內容頁面時,在 NewItem 對話框裡選擇 "select master page", 然後選擇項目中已創建的 MasterPage. 產生的代碼里, 第一行的MasterPageFile 屬性指定了 MasterPageFile 位置,如:

<%@ Page Title="无标题页面" Language="C#" MasterPageFile="~/testMasterPage.master" AutoEventWireup="true" CodeFile="testForm.aspx.cs" Inherits="testForm" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
</asp:Content>

可以在 web.config 指定MasterPage:

    <configuration>
         <system.web>
             <pages masterPageFile="~/x.master" />
         </system.web>
     </configuration>

在每個網頁的<%@ Page %> 里指定的MasterPage會覆蓋 web.config 里的設置。

利用 web.config的location元素,可以僅對一組 pages 指定 MasterPage. 例如,對 Admin 目錄下的頁面採用的不同的 MasterPage:

    <configuration>
         <location path="Admin">
             <system.web>
                 <pages masterPageFile="~/y.master" />
             </system.web>
         </location>
     </configuration>

可用編程的方式指定 Master Page:

    protected void Page_PreInit(object sender, EventArgs e)
     {
         Page.MasterPageFile = "~/x.master";
     }

讀寫master page

編輯

在 MasterPage 中指定的title為默認標題。在具體的內容頁面,可以有兩個辦法修改title:

   <%@ Page Title="test" %>
//或在代码中:
   protected void Page_LoadComplete(object sender, EventArgs e)
       {
             Master.Page.Title = "Hello"; 
        }

在具體的內容頁面訪問 MasterPage 中的屬性和控件,如上例,用 Master 屬性來訪問。例如,在 MasterPage 中有一個 Label1, 那麼在具體內容頁面可以如此訪問:

        protected void Page_LoadComplete(object sender, EventArgs e)
         {
             string text = (Master.FindControl("Label1") as Label).Text;//后期绑定控件
         }

各種頁面事件的發生次序

編輯

母版頁和內容頁都可以包含控件的事件處理程序。對於控件而言內容頁中的控件在內容頁中引發事件,母版頁中的控件在母版頁中引發事件。控件事件不會從內容頁發送到母版頁,也不能在內容頁中處理來自母版頁控件的事件,它們只會在自己事件內部進行處理。下面是母版頁(Master)與內容頁(ContentPage)合併後事件的發生順序:

  1. ContentPage.PreInit
  2. Master頁面控件 Init 事件
  3. ContentPage頁面控件 Init 事件
  4. Master.Init
  5. ContentPage.Init
  6. ContentPage.InitComplete
  7. ContentPage.PreLoad
  8. ContentPage.Load
  9. Master.Load
  10. ContentPage頁面控件 Load 事件
  11. ContentPage.LoadComplete
  12. ContentPage.PreRender
  13. Master.PreRender
  14. Master頁面控件 PreRender 事件
  15. ContentPage頁面控件 PreRender 事件
  16. ContentPage.PreRenderComplete

Master、用戶自定義控件裡面是沒有PreInit、OnComplete事件.Master本身就是一個用戶控件usercontrol,usercontrol繼承TemplateControl,TemplateControl繼承Control

如果客戶端程序(如JavaScript)中會用到客戶端body對像的onload事件,注意這個客戶端事件是最後執行,即在服務器端所有事件執行完後才執行。