6.4 嵌套母版页
所谓"嵌套",就是一个套一个,大的容器套装小的容器。嵌套母版页就是指创建一个大母版页,在其中包含另外一个小的母版页。如图6.5所示显示的是嵌套母版页的示意图。
利用嵌套的母版页可以创建组件化的母版页。例如,大型网站可能包含一个用于定义站点外观的总体母版页,然后,不同的网站内容合作伙伴又可以定义各自的子母版页,这些子母版页引用网站母版页,并相应定义合作伙伴的内容外观。
例6.1 创建一个简单的嵌套母版页(示例位置:mr"sl"06"01)
下面的示例主要通过一个简单的嵌套母版页示例来加深读者对嵌套母版页的理解。执行程序,示例运行结果如图6.6所示。
程序实现的主要步骤为:
(1)新建一个网站,将其命名为01。
(2)在该网站的解决方案下,右击网站名称,在弹出的快捷菜单中选择"添加新项"命令,打开"添加新项"对话框,首先添加两个母版页,分别命名为MainMaster(主母版页)和SubMaster(子母版页),然后再添加一个Web窗体,命名为Default.aspx,并将其作为SubMaster(子母版页)的内容页。
如图6.6所示的页面是由主母版页(MainMaster)、子母版页(SubMaster)和内容页(Default.aspx)组成的,主母版页包含的内容主要是页面的公共部分,主母版页嵌套子母版页,内容页绑定子母版页。
(3)主母版页的构建方法与普通的母版页的方法一致。由于主母版页嵌套一个子母版页,因此必须在适当的位置设置一个ContentPlaceHolder控件实现占位。主母版页的设计代码如下:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile=" |
(4)子母版页以.master为扩展名,其代码包括两个部分,即代码头声明和Content控件。子母版页与普通母版页相比,子母版页中不包括<html>、<body>等Web元素。在子母版页的代码头中添加了一个属性MasterPageFile,以设置嵌套子母版页的主母版页路径,通过设置这个属性,实现主母版页和子母版页之间的嵌套。子母版页的Content控件中声明的ContentPlaceHolder控件用于为内容页实现占位。子母版页的设计代码如下:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile=" |
(5)内容页的构建方法与普通内容页的一致。它的代码包括两部分,即代码头声明和Content控件。由于内容页绑定子母版页,所以代码头中的属性MasterPageFile必须设置为子母版页的路径。内容页的设计代码如下:
<%@ Page Language="C#" MasterPageFile="~/SubMaster.master" AutoEventWireup="true" |
注意:创建嵌套母版页过程中,Visual Studio 2005只支持对主母版页的编辑,而不支持子母版页和内容页。也就是说必须在代码模式下,创建子母版页和内容页。
6.5 访问母版页的控件和属性
内容页中引用母版页中的属性、方法和控件有一定的限制。对于属性和方法的规则是:如果它们在母版页上被声明为公共成员,则可以引用它们,这包括公共属性和公共方法。在引用母版页上的控件时,没有只能引用公共成员的这种限制。
6.5.1 使用Master.FindControl()方法访问母版页上的控件
在内容页中,Page对象具有一个公共属性Master,该属性能够实现对相关母版页基类MasterPage的引用。母版页中的MasterPage相当于普通ASP.NET页面中的Page对象,因此,可以使用Masterpage对象实现对母版页中各个子对象的访问,但由于母版页中的控件是受保护的,不能直接访问,那么就必须使用MasterPage对象的FindControl方法实现。
例6.2 访问母版页上的控件(示例位置:mr"sl"06"02)
下面的示例主要通过使用FindControl方法,获取母版页中用于显示系统时间的Label控件。执行程序,示例运行结果如图6.7所示。
程序实现的主要步骤为:
(1)新建一个网站,首先添加一个母版页,默认名称为MasterPage.master,再添加一个Web窗体,命名为Default.aspx,作为母版页的内容页。
(2)分别在母版页和内容页上添加一个Label控件。母版页的Label控件的ID属性为labMaster,用来显示系统日期。内容页的Label控件的ID属性为labContent,用来显示母版页中的Label控件值。
(3)在MasterPage.maste母版页的Page_Load事件中,使母版页的Label控件显示当前系统日期的代码如下。
protected void Page_Load(object sender, EventArgs e) (4)在Default.aspx内容页中的Page_LoadComplete事件中,使内 protected void labContent_PreRender(object sender, EventArgs e) |
注意:由于在母版页的Page_Load事件引发之前,内容页Page_Load事件已经引发,所以,此时从内容页中访问母版页中的控件比较困难。所以,本示例使用ASP.NET2.0新增的Page_LoadComplete事件,利用FindControl()方法来获取母版页的控件,其中Page_LoadComplete事件是在生命周期内和网页加载结束时触发。当然还可以在Label控件的PreRender事件下完成此功能
6.5.2 引用@MasterType指令访问母版页上的属性
引用母版页中的属性和方法,需要在内容页中使用MasterType指令,将内容页的Master属性强类型化,即通过MasterType指令创建与内容页相关的母版页的强类型引用。另外,在设置MasterType指令时,必须设置VirtualPath属性以便指定与内容页相关的母版页存储地址。
例6.3 访问母版页上的属性(示例位置:mr"sl"06"03)
下面的示例主要通过使用MasterType指令引用母版页的公共属性,并将Welcome字样赋给母版页的公共属性。执行程序,示例运行结果如图6.8所示。
程序实现的主要步骤为:
(1)程序开发步骤参见示例06"02。
(2)在母版页中定义了一个String类型的公共属性MValue。代码如下:
public partial class MasterPage : System.Web.UI.MasterPage |
并且通过<%= MValue %>显示在母版面中,代码如下:
//其他代码 |
(3)在内容页代码头的设置中,增加了<%@MasterType%>,并在其中设置了VirtualPath属性,用于设置被强类型化的母版页的URL地址。代码如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup=" |
(4)在内容页的Page_Load事件下,通过Master对象引用母版页中的公共属性,并将Welcome字样赋给母版页中的公共属性。代码如下:
protected void Page_Load(object sender, EventArgs e) |
6.6 实践与练习
创建一个单击母版页中的导航按钮,在内容页中显示刚刚所单击按钮的名称的Web应用程