以編程方式使用 ASP.NET 主版頁面

來源:互聯網
上載者:User

可以使用主版頁面以編程方式執行許多公用任務,包括:

  • 訪問在主版頁面上定義的成員(包括公用屬性/方法或控制項)。

  • 動態地將主版頁面附加到內容頁。

訪問主版頁面上的成員

為了提供對主版頁面成員的訪問,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>

 轉載地址:http://blog.coders.com.cn/pignut_wang/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.