以编程方式使用 ASP.NET 母版页
访问母版页上的成员
为了提供对母版页成员的访问,Page 类公开了 Master 属性。若要从内容页访问特定母版页的成员,可以通过创建 @ MasterType 指令创建对此母版页的强类型引用。可使用该指令指向一个特定的母版页。当该内容页创建自己的 Master 属性时,属性的类型被设置为引用的母版页。
例如,可能有一个名为 MasterPage.master 的母版页,该名称是类名 MasterPage_master。可用创建类似于以下内容的 @ Page 和 @ MasterType 指令:
<%@ Page masterPageFile="~/MasterPage.master"%>
<%@ MasterType virtualPath="~/MasterPage.master"%>
当使用 @ MasterType 指令时(如本示例中的指令),可以引用母版页上的成员,如下面的示例所示:
CompanyName.Text = Master.CompanyName
CompanyName.Text = Master.CompanyName;
该页的 Master 属性的类型已设置为 MasterPage_master。
获取母版页上的控件的值
在运行时,母版页与内容页合并,因此内容页的代码可以访问母版页上的控件。(如果母版页的 ContentPlaceHolder 控件中包含一些控件,则这些控件被内容页的 Content 控件重写后将不可访问。)这些控件是受保护的,因此不能作为母版页成员直接访问。但是,可以使用 FindControl 方法定位母版页上的特定控件。如果要访问的控件位于母版页的 ContentPlaceHolder 控件内部,必须首先获取对 ContentPlaceHolder 控件的引用,然后调用其 FindControl 方法获取对该控件的引用。
下面的示例演示如何获取对母版页上的控件的引用。其中一个被引用的控件位于 ContentPlaceHolder 控件中,另一个则不是。
' Gets a reference to a TextBox control inside a ContentPlaceHolder Dim mpContentPlaceHolder As ContentPlaceHolder Dim mpTextBox As TextBox mpContentPlaceHolder = _ CType(Master.FindControl("ContentPlaceHolder1"), _ ContentPlaceHolder) If Not mpContentPlaceHolder Is Nothing Then mpTextBox = CType(mpContentPlaceHolder.FindControl("TextBox1"), _ TextBox) If Not mpTextBox Is Nothing Then mpTextBox.Text = "TextBox found!" End If End If ' Gets a reference to a Label control that is not in a ' ContentPlaceHolder control Dim mpLabel As Label mpLabel = CType(Master.FindControl("masterPageLabel"), Label) If Not mpLabel Is Nothing Then Label1.Text = "Master page label = " + mpLabel.Text End If
// Gets a reference to a TextBox control inside a ContentPlaceHolder ContentPlaceHolder mpContentPlaceHolder; TextBox mpTextBox; mpContentPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1"); if(mpContentPlaceHolder != null) { mpTextBox = (TextBox) mpContentPlaceHolder.FindControl("TextBox1"); if(mpTextBox != null) { mpTextBox.Text = "TextBox found!"; } } // Gets a reference to a Label control that is not in a // ContentPlaceHolder control Label mpLabel = (Label) Master.FindControl("masterPageLabel"); if(mpLabel != null) { Label1.Text = "Master page label = " + mpLabel.Text; }
如上所示,可以使用 FindControl 方法访问母版页 ContentPlaceHolder 控件的内容。如果 ContentPlaceHolder 控件已与 Content 控件的内容合并,ContentPlaceHolder 控件将不会包含自己的默认内容。相反,它将包含在内容页中定义的文本和控件。
动态地附加母版页
除了以声明方式指定母版页(在 @ Page 指令或配置文件中)外,还可以动态地将母版页附加到内容页。因为母版页和内容页会在页处理的初始化阶段合并,所以必须在此前分配母版页。通常,在 PreInit 阶段动态地分配母版页,如下面的示例所示:
Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) _
Handles Me.PreInit
Me.MasterPageFile = "~/NewMaster.master"
End Subvoid Page_PreInit(Object sender, EventArgs e)
{
this.MasterPageFile = "~/NewMaster.master";
}动态母版页的强类型
如果内容页使用 @ MasterType 指令将一个强类型赋给了母版页,该类型必须适用于动态分配的所有母版页。如果要动态地选择一个母版页,建议您创建一个基类,并从此基类派生母版页。此基母版页类随后可以定义母版页共有的属性和方法。在内容页中,当使用 @ MasterType 指令将一个强类型赋给母版页时,可以将类型赋给该基类而不是单个母版页。
下面的示例演示如何创建可以由多个母版页使用的基母版页类型。本示例包括一个从 MasterPage 控件派生的基类型、两个从该基类型继承的母版页和一个允许用户使用查询字符串 (?color=green) 动态选择母版页的内容页。此基主控类型定义了名为 MyTitle 的属性。其中一个母版页重写此 MyTitle 属性,另一个母版页没有重写。内容页将 MyTitle 属性作为页标题显示。因此,页标题将因所选择的母版页而异。
这是基母版页类型。它位于 App_Code 目录中。
Public Class BaseMaster Inherits MasterPage Public Overridable ReadOnly Property MyTitle() As String Get Return "BaseMaster Title" End Get End Property End Class
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public class BaseMaster : System.Web.UI.MasterPage { public virtual String MyTitle { get { return "BaseMaster Title"; } } }
这是第一个母版页,它显示蓝色背景。注意,@ Master 指令中的 Inherits 属性引用基类型。
<%@ Master Language="VB" Inherits="BaseMaster" ClassName="MasterBlue" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script runat="server"> ' No property here that overrrides the MyTitle property of the base master. </script> <html > <head runat="server"> <title>No title</title> </head> <body> <form id="form1" runat="server"> <div style="background-color:LightBlue"> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> Content from MasterBlue. </asp:contentplaceholder> </div> </form> </body> </html>
<%@ Master Language="C#" Inherits="BaseMaster" ClassName="MasterBlue" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script runat="server"> // No property here that overrrides the MyTitle property of the base master. </script> <html > <head id="Head1" runat="server"> <title>No title</title> </head> <body> <form id="form1" runat="server"> <div style="background-color:LightBlue"> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> Content from MasterBlue. </asp:contentplaceholder> </div> </form> </body> </html>
这是第二个母版页。除了显示绿色背景以及重写了基类型中定义的 MyTitle 属性外,它与第一个母版页相同。
<%@ Master Language="VB" Inherits="BaseMaster" ClassName="MasterGreen" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script runat="server"> Public Overrides ReadOnly Property MyTitle() As String Get Return "MasterGreen Title" End Get End Property </script> <html > <head runat="server"> <title>No title</title> </head> <body> <form id="form1" runat="server"> <div style="background-color:LightGreen"> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> Content from MasterGreen. </asp:contentplaceholder> </div> </form> </body> </html>
<%@ Master Language="C#" Inherits="BaseMaster" ClassName="MasterGreen" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script runat="server"> public override String MyTitle { get { return "MasterGreen Title"; } } </script> <html > <head id="Head1" runat="server"> <title>No title</title> </head> <body> <form id="form1" runat="server"> <div style="background-color:LightGreen"> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> Content from MasterGreen. </asp:contentplaceholder> </div> </form> </body> </html>
这是内容页,它允许用户基于由请求提供的查询字符串来选择母版页。使用 @ MasterType 指令将强类型赋给母版页的 Master 属性时,该指令引用基类型。
<%@ Page Language="VB" Title="Content Page" MasterPageFile="~/MasterBlue.master"%> <%@ MasterType TypeName="BaseMaster" %> <script runat="server"> Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Me.MasterPageFile = "MasterBlue.master" If Request.QueryString("color") = "green" Then Me.MasterPageFile = "MasterGreen.master" End If Me.Title = Master.MyTitle End Sub </script> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> Content from Content page. </asp:Content>
<%@ Page Language="C#" Title="Content Page" MasterPageFile="~/MasterBlue.master"%> <%@ MasterType TypeName="BaseMaster" %> <script runat="server"> protected void Page_PreInit(Object sender, EventArgs e) { this.MasterPageFile = "MasterBlue.master"; if(Request.QueryString["color"] == "green") { this.MasterPageFile = "MasterGreen.master"; } this.Title = Master.MyTitle; } </script> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> Content from Content page. </asp:Content>

浙公网安备 33010602011771号