Asp.Net 2.0 的 Master Page(主版頁面)

來源:互聯網
上載者:User

 

     Master Page(主版頁面)是VS2005中新引入的一個概念,它很好地實現介面設計的模組化,並且實現實現了代碼的重用。它就像婚紗影樓中的婚紗模板,同一個婚 紗模板可以給不同的新人用,只要把他們的照片貼在已有的婚紗模板就可以形成一張漂亮的婚紗照片,這樣可以大大簡化婚紗藝術照的設計複雜度。這裡的主版頁面就 像婚紗模板,而內容頁面就像兩位新人的照片。

       Master Page(主版頁面 副檔名是.master)

       它的使用跟普通的頁面一樣,可以可視化的設計,也可以編寫後置代碼。與普通頁面不一樣的是,它可以包含ContentPlaceHolder控制項,ContentPlaceHolder控制項就是可以顯示內容頁面的地區。

       代碼如下:

       <%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
......
           <form id="form1" runat="server">
           <div>
               <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
               </asp:contentplaceholder>
           </div>
           </form>
......

        

       注意:

           1、這裡的聲明指示符是“<%@ Master...%>”
           2、其內部包含<asp:contentplaceholder......>控制項

       內容頁(副檔名是.aspx)

       在建立內容頁面的時候,在“添加新項”對話方塊中要選中“選擇主版頁面”複選框。這樣建立的頁面就是內容頁面,內容頁面在顯示的時候會把母片面的內容一起以水 印淡化的形式顯示出來,而在主版頁面中的ContentPlaceHolder控制項地區會被內容頁面中的Content控制項替換,程式員可以在這裡編寫內容 頁面中的內容。

       代碼如下:

       <%@ Page Language="C#" MasterPageFile="~/MasterPage/MP.master" AutoEventWireup="true" CodeFile="Show1.aspx.cs" Inherits="MasterPage_Show1" Title="Untitled Page" %>
       <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
       </asp:Content>

 

       注意:

     1、這裡的聲明指示符中多了一項MasterPageFile="~/MasterPage/MP.master",這一項是在建立內容頁面時根據“選擇主版頁面”複選框的選中情況產生的。它指明了該頁是內容頁面,也指明了該內容頁面的主版頁面是哪個頁面。

     2、“<asp:Content ......>”就是要在其中顯示的內容。

       一、在主版頁面中編寫後台代碼,訪問主版頁面中的控制項

           與普通的aspx頁面一樣,雙擊按鈕即可編寫主版頁面中的代碼
    
       二、在內空頁面中編寫後台代碼,訪問內容頁面中的控制項

           與普通的aspx頁面一樣,雙擊按鈕即可編寫主版頁面中的代碼
    
       三、在內容頁面中編寫代碼訪問主版頁面中的控制項

       在內容頁面中有個Master對象,它是MasterPage類型,它代表當前內容頁面的主版頁面。通過這個對象的FindControl方法,我們可以找到母片面中的控制項,這樣就可以在內容頁面中操作主版頁面中的控制項了。

       TextBox txt = (TextBox)((MasterPage)Master).FindControl("txtMaster");
       txt.Text = this.txtContent1.Text; ;
        
       四、在內容頁面中編寫代碼訪問主版頁面中的屬性和方法

       仍可能通過Master對象進行訪問,只不過在這裡要把Master對象轉換成具體的主版頁面類型,然後再調用主版頁面中的屬性和方不法。

       這裡要說明的是:主版頁面中要被內容頁面調用的屬性和方法必須是Public修改的。否則無法調到。

       假設主版頁面中有下面的屬性和方法:
         public string TextValue
         {
             get
             {
                 return this.txtMaster.Text;
             }
             set
             {
                 this.txtMaster.Text = value;
             }
         }
         public void show(string str)
         {
             txtMaster.Text = str;
         }

        在內容頁面中可以通過下代的代碼來實現對主版頁面中方法的調用:

         ((MasterPage_MP)Master).show(this.txtContent1.Text);
         ((MasterPage_MP)Master).TextValue = this.txtContent1.Text;
        
       五、在主版頁面中訪問內容頁面的控制項

       在主版頁面中可以通過在ContentPlaceHolder控制項中調用FindControl方法來取得控制項,然後對控制項進行操作。

     ((TextBox)this.ContentPlaceHolder1.FindControl("txtContent1")).Text = this.txtMaster.Text;
    
       六、在主版頁面中訪問內容頁面中的方法和屬性

       在主版頁面中調用子頁面中的屬性和方法有點難度,因為我們無法像上一步中那樣通過FindControl來找到方法和屬性。
      
       於是我們想到在母片面的聲明指示符中加入下面的代碼:

       <%@ Reference Page="~/MasterPage/Show1.aspx" %>

       在啟動並執行時候回傳現有錯誤,錯誤的內容是“無法實現循環參考”。這是因為預設在子頁面中引用了主版頁面,你也就不能再在主版頁面中引用子頁面了。

       在網上沒找到更好的解決方案,但這使我們想起C#是的“反射”,它可以使我們動態擷取頁面對象,並且可以調用它的屬性和方法。

       代碼如下:

       Type t = this.ContentPlaceHolder1.Page.GetType();
       PropertyInfo pi = t.GetProperty("ContentValue");    //擷取ContentValue屬性
       pi.SetValue(this.ContentPlaceHolder1.Page,this.txtMaster.Text,null);     //給屬性賦值
        
       MethodInfo mi = t.GetMethod("SetValue");    //擷取SetValue()方法
       object[] os = new object[1];    //建造輸入參數
       os[0] = txtMaster.Text;
       mi.Invoke(this.ContentPlaceHolder1.Page, os);     //調用SetValue方法
        
       七、在有多個內容頁面使用母片面的情況下,在主版頁面中根據不同的內容頁面實現不同的操作

       在主版頁面中可以加入多個不同的內容頁面,但在設計期間,我們無法知道當前啟動並執行是哪個內容頁面。所以只能通過分支判斷當前啟動並執行是哪個子頁面,來執行不同的操作。這裡也用到了反射的知識。

       代碼如下:

         string s = this.ContentPlaceHolder1.Page.GetType().ToString();    //取出內容頁面的類型名稱
         if (s == "ASP.default17_aspx")    //根據不同的內容頁面類型執行不同的操作
         {
             ((TextBox)this.ContentPlaceHolder1.FindControl("TextBox2")).Text = "MastPage";
         }
         else if (s == "ASP.default18_aspx")
         {
             ((TextBox)this.ContentPlaceHolder1.FindControl("TextBox2")).Text = "Hello MastPage";
         }

       八、在母片面與內容頁面中JS代碼的操作

       在主版頁面或內容頁面中的控制項運行之後會自動產生ID,如文字框的ID是txtContent1,在運行之後ID會自動變為 ctl00_ContentPlaceHolder2_txtContent1,name屬性會變為 ctl00$ContentPlaceHolder2$txtContent1。

       在JS代碼中,我們用document.getElementById()方法,根據id取得控制項對象的時候,應當使用ctl00_ContentPlaceHolder2_txtContent1這個ID名,否則會產生“未找到對象”的異常。

      主版頁面運行機制

       主版頁面僅僅是一個頁面模板,單獨的主版頁面是不能被使用者所訪問的。單獨的內容頁也不能夠使用。主版頁面和內容頁有著嚴格對應關係。主版頁面中包含多少個 ContentPlaceHolder控制項,那麼內容頁中也必須設定與其相對應的Content控制項。當用戶端瀏覽器向伺服器發出請求,要求瀏覽某個內容 頁面時,ASP.NET引擎將同時執行內容頁和主版頁面的代碼,並將最終結果發送給用戶端瀏覽器。

      主版頁面和內容頁的運行過程可以概括為以下5個步驟:

       (1)使用者通過鍵入內容頁的URL來請求某頁。
       (2)擷取內容頁後,讀取@ Page指令。如果該指令引用一個主版頁面,則也讀取該主版頁面。如果是第一次請求這兩個頁,則兩個頁都要進行編譯。
       (3)主版頁面合并到內容頁的控制項樹中。
       (4)各個Content控制項的內容合并到主版頁面中相應的ContentPlaceHolder控制項中。
       (5)呈現得到結果頁。

      主版頁面和內容頁事件順序

       (1)主版頁面中控制項Init事件;
       (2)內容頁中Content控制項Init事件;
       (3)主版頁面Init事件;
       (4)內容頁Init事件;
       (5)內容頁Load事件;
       (6)主版頁面Load事件;
       (7)內容頁中Content控制項Load事件;
       (8)內容頁PreRender事件;
       (9)主版頁面PreRender事件;
       (10)主版頁面控制項PreRender事件。
       (11)內容頁中Content控制項PreRender事件。

      使用主版頁面的優點

       (1)有利於網站修改和維護,降低開發人員的工作強度
       (2)有利於實現頁面配置
       (3)提供一種便於利用的物件模型

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.