プログラミング方式でASPを使用する.NETマスターページ

10844 ワード

マスター・ページを使用して、次のような多くの共通タスクをプログラミングで実行できます.
  • は、マスター・ページで定義されたメンバー(共通のプロパティ/メソッドまたはコントロールを含む)にアクセスします.
  • は、マスターページをコンテンツページに動的に添付する.

  • マスターページのメンバーへのアクセス


    Pageクラスは、マスター・ページ・メンバーへのアクセスを提供するために、Master属性を開示する.コンテンツ・ページから特定のマスター・ページのメンバーにアクセスするには、@ MasterTypeを作成して、このマスター・ページの強いタイプの参照を作成します.このコマンドを使用して、特定のマスターページを指すことができます.コンテンツページが独自のMasterプロパティを作成すると、プロパティのタイプが参照のマスターページに設定されます.
    例えば、MasterPageという名前があるかもしれません.クラス名のマスターページmaster.次のような@ Pageおよび@MasterType命令を作成できます.
    <%@ Page  masterPageFile="~/MasterPage.master"%>
    <%@ MasterType  virtualPath="~/MasterPage.master"%>
    @MasterTypeコマンドを使用する場合(この例のコマンド)、次の例に示すように、マスターページのメンバーを参照できます.
    CompanyName.Text = Master.CompanyName;
    このページのMasterプロパティのタイプはMaster Pageに設定されています.master.

    マスターページのコントロールの値を取得


    実行時に、マスター・ページがコンテンツ・ページに結合されるため、コンテンツ・ページのコードはマスター・ページのコントロールにアクセスできます.(マスターページのContentPlaceHolderコントロールにいくつかのコントロールが含まれている場合、これらのコントロールはコンテンツページのContentコントロールに書き換えられてアクセスできません.)これらのコントロールは保護されているため、マスターページのメンバーとして直接アクセスすることはできません.ただし、FindControlメソッドを使用して、マスターページの特定のコントロールを特定できます.アクセスするコントロールがマスターページのContentPlaceHolderコントロールの内部にある場合は、まずContentPlaceHolderコントロールへの参照を取得し、FindControlメソッドを呼び出してコントロールへの参照を取得する必要があります.
    次の例では、マスター・ページのコントロールへの参照を取得する方法を示します.参照されるコントロールの1つはContentPlaceHolderコントロールにあり、もう1つはそうではありません.
     
    // 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コントロールから派生したベース・タイプ、ベース・タイプから継承された2つのマスター・ページ、およびユーザーがクエリー文字列(?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> 

    これは2番目のマスターページです.緑色のバックグラウンドを表示し、ベース・タイプで定義されたMyTitleプロパティを書き換えた場合を除き、最初のマスター・ページと同じです.
     
    <%@ Master Language="C#"Inherits="BaseMaster"
        ClassName="MasterGreen"%>
    //W3C//DTD XHTML 1.1//EN"
        "http:
    //www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

       
    public override String MyTitle
        {
           
    get {
    return "MasterGreen Title"; }
        }


      
        No title


       

       

                        runat="server">
                Content from MasterGreen.
           

       

       



    これは、リクエストによって提供されたクエリー文字列に基づいてマスター・ページを選択できるコンテンツ・ページです.@MasterType命令を使用してマスターページのMaster属性に強いタイプを割り当てる場合、この命令はベースタイプを参照します.
     
    <%@ Page Language="C#"Title="Content Page"%>
    <%@ MasterType TypeName="BaseMaster"%>

       
    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;
        }

            Runat="Server">
        Content from Content page.

    転載先:
    http://blog.coders.com.cn/pignut_wang/