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事件,注意这个客户端事件是最后执行,即在服务器端所有事件执行完后才执行。