5.5 访问母版页的控件和属性
视频讲解
对在内容页中引用母版页中的属性、方法和控件是有一定限制的。对于属性和方法的规则是:如果它们在母版页上被声明为公共成员,则可以引用它们,这包括公共属性和公共方法。在引用母版页上的控件时,没有只能引用公共成员的这种限制。
5.5.1 使用Master.FindControl()方法访问母版页上的控件
在内容页中,Page对象具有一个公共属性Master,该属性能够实现对相关母版页基类MasterPage的引用。母版页中的MasterPage相当于普通ASP.NET页面中的Page对象,因此,可以使用MasterPage对象实现对母版页中各个子对象的访问,但由于母版页中的控件是受保护的,不能直接访问,那么就必须使用MasterPage对象的FindControl方法实现。
【例5.2】访问母版页上的控件。(示例位置:mr\TM\05\02)
下面的示例主要通过使用FindControl方法,获取母版页中用于显示系统时间的Label控件。执行程序,示例运行结果如图5.7所示。
图5.7 嵌套母版页
程序实现的主要步骤如下。
(1)新建一个网站,首先添加一个母版页,默认名称为MasterPage.master,再添加一个Web窗体,命名为Default.aspx,作为母版页的内容页。
(2)分别在母版页和内容页上添加一个Label控件。母版页的Label控件的ID属性为labMaster,用来显示系统日期。内容页的Label控件的ID属性为labContent,用来显示母版页中的Label控件值。
(3)在MasterPage.master母版页的Page_Load事件中,使母版页的Label控件显示当前系统日期的代码如下:
(4)在Default.aspx内容页的Page_LoadComplete事件中,使内容页的Label控件显示母版页中的Label控件值的代码如下:
注意
由于在母版页的Page_Load事件引发之前,内容页Page_Load事件已经引发,所以,此时从内容页访问母版页中的控件比较困难。所以,本示例使用ASP.NET 2.0(及以上版本)新增的Page_LoadComplete事件,利用FindControl()方法来获取母版页的控件,其中Page_LoadComplete事件是在生命周期内和网页加载结束时触发。当然还可以在Label控件的PreRender事件下完成此功能。
5.5.2 引用@MasterType指令访问母版页上的属性
引用母版页中的属性和方法,需要在内容页中使用MasterType指令,将内容页的Master属性强类型化,即通过MasterType指令创建与内容页相关的母版页的强类型引用。另外,在设置MasterType指令时,必须设置VirtualPath属性以便指定与内容页相关的母版页存储地址。
【例5.3】访问母版页上的属性。(示例位置:mr\TM\05\03)
下面的示例主要通过使用MasterType指令引用母版页的公共属性,并将Welcome字样赋给母版页的公共属性。执行程序,示例运行结果如图5.8所示。
程序实现的主要步骤如下。
(1)程序开发步骤参见例5.2。
(2)在母版页中定义了一个String类型的公共属性MValue,代码如下:
图5.8 访问母版页上的属性
并且通过<%= MValue %>显示在母版面中,代码如下:
(3)在内容页代码头的设置中增加了<%@MasterType%>,并在其中设置了VirtualPath属性,用于设置被强类型化的母版页的URL地址。代码如下:
(4)在内容页的Page_Load事件下,通过Master对象引用母版页中的公共属性,并将Welcome字样赋给母版页中的公共属性。代码如下:
说明
以上代码在内容页中的赋值,将影响母版页中公共属性的值。