跳转到内容

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