1. 概述
母版页中包含的是页面公共部分,即网页模板。因此,在创建示例之前,必须判断哪些内容是页面公共部份.
使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页(或一组页)定义所需的外观和标准行为。然后可以创建包含要显示的内容的各个内容页。当用户请求内容页时,这些内容页与母版页合并以将母版页的布局与内容页的内容组合在一起输出。
在PetShop4.0中,页面都是基于母版页的形式,也是微软强烈推荐的.
2. 使用
添加新项,选者母版页,VS会自动创建后缀名为master的母版页.
@ Master 指令可以包含的指令与 @ Control 指令可以包含的指令大多数是相同的。例如,下面的母版页指令包括一个代码隐藏文件的名称并将一个类名称分配给母版页。
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
除 @ Master 指令外,母版页还包含页的所有顶级 HTML 元素,如 html、head 和 form。例如,在母版页上可以将一个 HTML 表用于布局、将一个 img 元素用于公司徽标、将静态文本用于版权声明并使用服务器控件创建站点的标准导航。您可以在母版页中使用任何 HTML 元素和 ASP.NET 元素。
除会在所有页上显示的静态文本和控件外,母版页还包括一个或多个 ContentPlaceHolder 控件。这些占位符控件定义可替换内容出现的区域。接着在内容页中定义可替换内容。
要使内容页用母版页,在指定的页面里的@ Pagel输入MasterPageFile="~/MasterPage.master"
如图,在母板页里设计以下页面
在内容页里调用后
效果
如果无法在内容页的Content里自定义的话
点击 (智能标示)或右键 创建自定义内容
3. 母版页的优点
母版页提供了开发人员已通过传统方式创建的功能,这些传统方式包括重复复制现有代码、文本和控件元素;使用框架集;对通用元素使用包含文件;使用 ASP.NET 用户控件等。母版页具有下面的优点:
· 使用母版页可以集中处理页的通用功能,以便可以只在一个位置上进行更新。
· 使用母版页可以方便地创建一组控件和代码,并将结果应用于一组页。例如,可以在母版页上使用控件来创建一个应用于所有页的菜单。
· 通过允许控制占位符控件的呈现方式,母版页使您可以在细节上控制最终页的布局。
4.母版页与主题
不能直接将 ASP.NET 主题应用于母版页。如果向 @ Master 指令添加一个主题属性,则页在运行时会引发错误。
但是,主题在下面这些情况中会应用于母版页:
· 如果主题是在内容页中定义的。母版页在内容页的上下文中解析,因此内容页的主题也会应用于母版页。
· 如果通过在 pages 元素(ASP.NET 设置架构) 元素中包含主题定义来将整个站点配置为使用主题。
有关更多信息,请参见 ASP.NET 主题和外观概述。
5.限定母版页的范围
可以在三种级别上将内容页附加到母版页:
页级 可以在每个内容页中使用页指令来将内容页绑定到一个母版页,如下面的代码示例中所示。
<%@ Page Language="C#" MasterPageFile="MySite.Master" %>
应用程序级 通过在应用程序的配置文件 (Web.config) 的 pages 元素中进行设置,可以指定应用程序中的所有 ASP.NET 页(.aspx 文件)都自动绑定到一个母版页。该元素可能看起来类似于下面这样。
<pages masterPageFile="MySite.Master" />
如果使用此策略,则应用程序中的所有具有 Content 控件的 ASP.NET 页都与指定的母版页合并。(如果某个 ASP.NET 页不包含 Content 控件,则不应用该母版页。)
文件夹级 此策略类似于应用程序级的绑定,不同的是只需在一个文件夹中的一个 Web.config 文件中进行设置。然后母版页绑定会应用于该文件夹中的 ASP.NET 页。
6. 调用母版页事件
比如说,在母版页中有个按扭
<asp:Button ID="Button1" runat="server" Text="Button"/>
那么在内容页中可以在Page_Load里委托函数:
protected void Page_Load(object sender, EventArgs e)
{
Button B1 = (Button)Page.Master.FindControl("Button1");
B1.Click += new EventHandler(B1_Click);
}
然后将自己希望执行的代码放在函数B1_Click里:
protected void B1_Click(object sender, EventArgs e)
{
Response.Write("Hello World!");
}
运行以后,按下Button1,页面即会显示Hello World!
如果母版页中也有该按扭Click事件:
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write("Hello BeiJing!");
}
那么这两个函数都会执行。顺序是先母版页,后内容页。
事件本质上是一个委托。委托这个东西,我的理解是一个函数的执行器,将函数传给它(委托给它,+=),就会按照先后顺序执行。委托就好比一支手枪,函数就好比子弹。只要子弹尺寸口径合适(函数的参数、类型符合声明),不管是中国造的子弹,还是德国造的子弹,都可以打出去。给一发打一发,给两发打两发。
另外,访问母版页的控件,可以通过类似(Button)Page.Master.FindControl("Button1");的方式。如果想访问母版页的属性,需要在内容页加入类似一句:<%@ MasterType virtualpath="~/Master/list.master" %>
7. 有母版页的页面加载顺序
1. 母版页控件 Init 事件。
2. 内容控件 Init 事件。
3. 母版页 Init 事件。
4. 内容页 Init 事件。
5. 内容页 Load 事件。
6. 母版页 Load 事件。
7. 内容控件 Load 事件。
8. 内容页 PreRender 事件。
9. 母版页 PreRender 事件。
10. 母版页控件 PreRender 事件。
11. 内容控件 PreRender 事件。