以編程方式使用 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;

該頁的 Master 屬性的類型已設置爲 MasterPage_master

獲取母版頁上的控件的值

在運行時,母版頁與內容頁合併,因此內容頁的代碼可以訪問母版頁上的控件。(如果母版頁的 ContentPlaceHolder 控件中包含一些控件,則這些控件被內容頁的 Content 控件重寫後將不可訪問。)這些控件是受保護的,因此不能作爲母版頁成員直接訪問。但是,可以使用 FindControl 方法定位母版頁上的特定控件。如果要訪問的控件位於母版頁的 ContentPlaceHolder 控件內部,必須首先獲取對 ContentPlaceHolder 控件的引用,然後調用其 FindControl 方法獲取對該控件的引用。

下面的示例演示如何獲取對母版頁上的控件的引用。其中一個被引用的控件位於 ContentPlaceHolder 控件中,另一個則不是。

 
// 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 階段動態地分配母版頁,如下面的示例所示:

void Page_PreInit(Object sender, EventArgs e)
{    this.MasterPageFile = "~/NewMaster.master";
}

動態母版頁的強類型

如果內容頁使用 @ MasterType 指令將一個強類型賦給了母版頁,該類型必須適用於動態分配的所有母版頁。如果要動態地選擇一個母版頁,建議您創建一個基類,並從此基類派生母版頁。此基母版頁類隨後可以定義母版頁共有的屬性和方法。在內容頁中,當使用 @ MasterType 指令將一個強類型賦給母版頁時,可以將類型賦給該基類而不是單個母版頁。

下面的示例演示如何創建可以由多個母版頁使用的基母版頁類型。本示例包括一個從 MasterPage 控件派生的基類型、兩個從該基類型繼承的母版頁和一個允許用戶使用查詢字符串 (?color=green) 動態選擇母版頁的內容頁。此基主控類型定義了名爲 MyTitle 的屬性。其中一個母版頁重寫此 MyTitle 屬性,另一個母版頁沒有重寫。內容頁將 MyTitle 屬性作爲頁標題顯示。因此,頁標題將因所選擇的母版頁而異。

這是基母版頁類型。

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="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="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="C#" Title="Content Page" %>
<%@ 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>
 
發佈了24 篇原創文章 · 獲贊 0 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章