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)合併後事件的發生順序:
- ContentPage.PreInit
- Master頁面控制項 Init 事件
- ContentPage頁面控制項 Init 事件
- Master.Init
- ContentPage.Init
- ContentPage.InitComplete
- ContentPage.PreLoad
- ContentPage.Load
- Master.Load
- ContentPage頁面控制項 Load 事件
- ContentPage.LoadComplete
- ContentPage.PreRender
- Master.PreRender
- Master頁面控制項 PreRender 事件
- ContentPage頁面控制項 PreRender 事件
- ContentPage.PreRenderComplete
Master、用戶自定義控制項裡面是沒有PreInit、OnComplete事件.Master本身就是一個用戶控制項usercontrol,usercontrol繼承TemplateControl,TemplateControl繼承Control
如果客戶端程序(如JavaScript)中會用到客戶端body對像的onload事件,注意這個客戶端事件是最後執行,即在伺服器端所有事件執行完後才執行。