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事件,注意這個客戶端事件是最後執行,即在伺服器端所有事件執行完後才執行。