MasterPage(母版页):
1.MSDN中的概述:
使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页(或一组页)定义所需的外观和标准行为。然后可以创建包含要显示的内容的各个内容页。当用户请求内容页时,这些内容页与母版页合并以将母版页的布局与内容页的内容组合在一起输出。
母版页实际由两部分组成,即母版页本身与一个或多个内容页。
母版页:
母版页为具有扩展名 .master(如 MySite.master)的 ASP.NET 文件,它具有可以包括静态文本、HTML 元素和服务器控件的预定义布局。母版页由特殊的 指令识别,该指令替换了用于普通 .aspx 页的 指令。其它的结构和可用元素均与普通.asp页面无异。
母版页的声明:
a. 一般页面指令:
<%@ Master Language="C#" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<configuration>
<system.web>
<pages masterPageFile="~/Site.master" />
</system.web>
</configuration>
c. 动态应用母版页:
void Page_PreInit (Object sender, EventArgs e)
{
Page.MasterPageFile = "~/Site.master";
}
可替换内容占位符:
除会在所有页上显示的静态文本和控件外,母版页还包括一个或多个 控件。这些占位符控件定义可替换内容出现的区域。这些区域可以被其它内容页继承。该区域内用来摆放各个页面自己的控件。接着就可以在内容页中定义可替换内容。
<body>
<form id="form1" runat="server">
<div>
<asp:contentplaceholder id="Main" runat="server">
</asp:contentplaceholder>
<asp:contentplaceholder id="Footer" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
内容页:
通过创建各个内容页来定义母版页的占位符控件的内容,这些内容页为绑定到特定母版页的 ASP.NET 页(.aspx 文件以及可选的代码隐藏文件)。通过包含指向要使用的母版页的 属性,在内容页的 @ Page 指令中建立绑定。例如,一个内容页可能包含下面的 @ Page 指令,该指令将该内容页绑定到
Master1.master
母版页。
内容页的声明:
<%@ Page Language="C#" MasterPageFile="~/MasterPages/Master1.master" Title="Content Page"%>
Main
和
Footer
的内容占位符。在内容页中,可以创建两个 Content 控件,一个映射到 ContentPlaceHolder 控件
Main
,而另一个映射到 ContentPlaceHolder 控件
Footer。
代码如下:
<% @ Page Language="C#" MasterPageFile="~/Master.master" Title="Content Page 1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
Main content.
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="Footer" Runat="Server" >
Footer content.
</asp:content>
以上代码仅仅是在两个不同的Content中显示出不同的两行文本以示区分而已。
创建 Content 控件后,向这些控件添加文本和控件。在内容页中,Content 控件外的任何内容(除服务器代码的脚本块外)都将导致错误。在 ASP.NET 页中所执行的所有任务都可以在内容页中执行。
可以创建多个母版页来为站点的不同部分定义不同的布局,并可以为每个母版页创建一组不同的内容页。
2. 母版页的优点:
母版页提供了开发人员已通过传统方式创建的功能,这些传统方式包括重复复制现有代码、文本和控件元素;使用框架集;对通用元素使用包含文件;使用 ASP.NET 用户控件等。母版页具有下面的优点:
使用母版页可以集中处理页的通用功能,以便可以只在一个位置上进行更新。
使用母版页可以方便地创建一组控件和代码,并将结果应用于一组页。例如,可以在母版页上使用控件来创建一个应用于所有页的菜单。
通过允许控制占位符控件的呈现方式,母版页使您可以在细节上控制最终页的布局。
母版页提供一个对象模型,使用该对象模型可以从各个内容页自定义母版页。
3. 母版页的运行时行为:
在运行时,母版页是按照下面的步骤处理的:
用户通过键入内容页的 URL 来请求某页。
获取该页后,读取 @ Page 指令。如果该指令引用一个母版页,则也读取该母版页。如果这是第一次请求这两个页,则两个页都要进行编译。
包含更新的内容的母版页合并到内容页的控件树中。
各个 Content 控件的内容合并到母版页中相应的 ContentPlaceHolder 控件中。
浏览器中呈现得到的合并页。
注意: 一般说来,此结构对如何构造页或编写页的程序无任何影响。但是在某些情况下,如果在母版页上设置一个页范围的属性,则该属性可能会影响内容页的行为,这是因为母版页是页上控件的最近的父级。例如,如果在内容页上将 属性设置为 true,而在母版页中将相同的属性设置为 false,实际上会禁用视图状态,因为母版页上的设置具有优先权。
4. 如何:引用 ASP.NET 母版页中的内容:
可以在内容页中编写代码来引用母版页中的属性、方法和控件,但这种引用有一定的限制。对于属性和方法的规则是:如果它们在母版页上被声明为公共成员,则可以引用它们。这包括公共属性和公共方法。在引用母版页上的控件时,没有只能引用公共成员的这种限制。
首先:获得母版页的引用。获得继承自System.Web.UI.MasterPage类的一个实例对象。如果页面没有应用母版页,则返回Null。
其次:
动态操作定义在母版页当中的内容。
第一种方法:使用FindControl进行弱类型的操作。使用 方法,将 Master 属性的返回值用作命名容器。
例如:母版页中定义一个Label控件:
<asp:Label ID="Title" RunAt="server" />
内容页中,因为 Label 控件处在 控件的内部,必须首先获取对 ContentPlaceHolder 的引用,然后使用其 FindControl 方法来定位 Label 控件。:
ContentPlaceHolder mpContentPlaceHolder;
mpContentPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
if(mpContentPlaceHolder != null)
{
Label mpLabel = (Label) Master.FindControl("Title");
if(mpLabel != null)
{
mpLabel.Text = "Label found!";
}
}
第二种方法:使用母版页当中的公开属性进行强类型的操作(推荐)。
例如:母版页中定义一个Label控件,同时,需要定义对它进行操作的属性:
<asp:Label ID="Title" RunAt="server" />
<script language="C#" runat="server">
public string TitleText
{
get { return Title.Text; }
set { Title.Text = value; }
}
</script>
注意: 这里Get方法,用来获得Label的Text属性;Set方法用来设置Text属性值。
内容页中:
Master.TitleText = "Label found!";
5. 母版页的嵌套:
与任何母版页一样,子母版页也包含文件扩展名 .master。子母版页通常会包含一些内容控件,这些控件将映射到父母版页上的内容占位符。就这方面而言,子母版页的布局方式与所有内容页类似。但是,子母版页还有自已的内容占位符,可用于显示其子页提供的内容。
例如:父母版页(Parent.master):
<% @ Master Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML
1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<form id="Form1" runat="server">
<div>
<p>
<font color="red">This is parent master content.</font>
</P>
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
</div>
</form>
</body>
</html>
<%@ Master Language="C#" MasterPageFile ="~/Parent.master"%>
<asp:Content id="Content1" ContentPlaceholderID="MainContent" runat="server">
<asp:panel runat="server" id="panelMain" backcolor="lightyellow">
<h2>Child master</h2>
<asp:panel runat="server" id="panel1" backcolor="lightblue">
<p>This is child master content.</p>
<asp:ContentPlaceHolder ID="Content1" runat="server" />
</asp:panel>
<asp:panel runat="server" id="panel2" backcolor="pink"
<p>This is child master content.</p>
<asp:ContentPlaceHolder ID="Content2" runat="server" />
</asp:panel>
</asp:panel>
</asp:Content>
继承子母版页的内容页:
< asp:Content id ="Content1" ContentPlaceholderID ="Content1" runat ="server" >
< asp:Label runat ="server" id ="Label1"
text ="Child label1" font-bold ="true" />
< br >
</ asp:Content >
< asp:Content id ="Content2" ContentPlaceholderID ="Content2" runat =server >
< asp:Label runat ="server" id ="Label2"
text ="Child label2" font-bold =true />
</ asp:Content >
至此,关于母版页的概述和应用就介绍完了,在项目中也得到了全面的发挥。祝大家编程愉快!