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 Page 构建的页面时,各种事件发生的次序如下:

  1. Master Page 子控件初始化;
  2. 内容页面子控件初始化;
  3. Master Page 初始化;
  4. 内容页面初始化;
  5. 内容页面 Page_Load;
  6. Master Page 的 Page_Load;
  7. Master Page 子控件加载;
  8. 内容页面子控件加载;
  9. 内容页面的 Page_LoadComplete:如果要访问 Master Page 里的服务器控件,必须在本方法里做。