14.2 在母版页和内容页之间传递数据
在实际开发中,经常需要将母版页的一些公有属性或方法传给内容页,又或者在内容页面里设置母版页的这些公有属性的值。因此,这就要求内容页和母版页能够进行实时的交互。
内容页和母版页交互的第一步就是在母版页类里添加公有的属性或方法。在下面的示例中,在Test.Master文件里设置了一个名为MyTxt的公有属性:
public partial class Test:System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
private string mytxt="母版页里的MyTxt属性的初始值";
public string MyTxt
{
get
{
return mytxt;
}
set
{
mytxt=value;
}
}
}
设置好这个公有属性之后,就可以在内容页里面调用或者设置这个公有属性的值。通常,要在内容页里调用母版页的公有属性,可以通过在内容页里使用Page.Master属性和MasterType指令这两种方法来完成。
14.2.1 使用Page.Master属性
Master属性返回的是一般的MasterPage类。因此,必须把它转换成特定类型的母版页类,才能访问母版页的这些公有的成员。如下面的代码所示:
public partial class WebForm1:System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Test test=((Tst)Page.Master;
Label1.Text="Label1:"+test.MyTxt;
test.MyTxt="Label2:在内容页里修改母版页的MyTxt属性的值。";
Label2.Text=test.MyTxt;
}
}
在上面的代码中,首先使用语句“Test test=(T est)Page.Master”来创建一个新对象test作为母版页的实例,然后再通过test去调用母版页的公有属性,如test.MyTxt。
14.2.2 使用MasterType指令
与Master属性相比,使用MasterType指令访问母版页更加简单,只需要在内容页面代码里面通过MasterType指令的VirtualPath属性来指定相应.master文件的虚拟路径就可以了。示例代码如下所示:
<%@Page Title=""Language="C#"MasterPageFile="~/Test.Master"
AutoEventWireup="true"CodeBehind="WebForm1.aspx.cs"
Inherits="_14_4.WebForm1"%>
<%@MasterType VirtualPath="~/Test.Master"%>
<asp:Content ID="Content1"ContentPlaceHolderID="Main"
runat="server">
<asp:Label ID="Label1"runat="server"></asp:Label>
<br/>
<asp:Label ID="Label2"runat="server"></asp:Label>
</asp:Content>
在内容页面代码里面添加好MasterType指令之后,就可以直接在内容页的后台代码里面通过访问Page类的Master属性来访问母版页的公有成员了,如Master.MyTxt,而无须再继续创建母版页的实例。示例代码如下所示:
public partial class WebForm1:System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text="Label1:"+Master.MyTxt;
Master.MyTxt="Label2:在内容页里修改母版页的MyTxt属性的值。";
Label2.Text=Master.MyTxt;
}
}
14.2.3 使用MasterPage.FindControl方法
除了上面两种方法之外,还可以通过MasterPage.FindControl()方法强行访问母版页上的某个控件。得到这个控件之后,就可以直接修改它。如在母版页里加入一个Label控件:
<asp:Label ID="Label1"runat="server"Text="Label"></asp:Label>
然后可以在内容页的后台代码中来调用这个Label控件,如下面的代码所示:
Label txt_msg=Master.FindControl("Label1")as Label;
if(txt_msg!=null)
{
txt_msg.Text="修改后的值";
}
运行页面,会发现母版页的Label1控件显示的值为“修改后的值”。
注意 当从一个页面导航到另一个页面时,所有的Web页面对象都会重新创建。也就是说,即使跳转到另一个使用相同母版页的内容页,ASP.NET也会创建一个不同的母版页对象实例。所以,用户每次跳转到一个新的页面时,MyTxt属性都会恢复它的默认值(即“母版页里的MyTxt属性的初始值”)。要改变这一行为,必须在其他位置(如cookie)保存信息,并在母版页编写检查这些值的初始化代码。