熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

asp.net 母版和內容頁執行順序

2013-11-13 10:10:31  來源: .NET編程 
    Master Page(母版頁)是VS中新引入的一個概念它很好地實現界面設計的模塊化並且實現實現了代碼的重用它就像婚紗影樓中的婚紗模板同一個婚 紗模板可以給不同的新人用只要把他們的照片貼在已有的婚紗模板就可以形成一張漂亮的婚紗照片這樣可以大大簡化婚紗藝術照的設計復雜度這裡的母版頁就 像婚紗模板而內容頁面就像兩位新人的照片
   
    Master Page(母版頁 擴展名是master)
   
    它的使用跟普通的頁面一樣可以可視化的設計也可以編寫後置代碼與普通頁面不一樣的是它可以包含ContentPlaceHolder控件ContentPlaceHolder控件就是可以顯示內容頁面的區域
   
    代碼如下
   
    <%@ Master Language=C# AutoEventWireup=true CodeFile=MasterPagemastercs Inherits=MasterPage %>
   
    ……
   
    <form id=form runat=server>
   
    <div>
   
    <asp:contentplaceholder id=ContentPlaceHolder runat=server>
   
    </asp:contentplaceholder>
   
    </div>
   
    </form>
   
    ……
     
    注意
   
    這裡的聲明指示符是<%@ Master…%>
   
    其內部包含<asp:contentplaceholder……>控件
   
    內容頁(擴展名是aspx)
   
    在建立內容頁面的時候添加新項對話框中要選中選擇母版頁復選框這樣建立的頁面就是內容頁面內容頁面在顯示的時候會把母版面的內容一起以水 印淡化的形式顯示出來而在母版頁中的ContentPlaceHolder控件區域會被內容頁面中的Content控件替換程序員可以在這裡編寫內容 頁面中的內容
   
    代碼如下
   
    <%@ Page Language=C# MasterPageFile=~/MasterPage/MPmaster AutoEventWireup=true CodeFile=Showaspxcs Inherits=MasterPage_Show Title=Untitled Page %>
   
    <asp:Content ID=Content ContentPlaceHolderID=ContentPlaceHolder Runat=Server>
   
    </asp:Content>
      
    注意
   
    這裡的聲明指示符中多了一項MasterPageFile=~/MasterPage/MPmaster這一項是在創建內容頁面時根據選擇母版頁復選框的選中情況生成的它指明了該頁是內容頁面也指明了該內容頁面的母版頁是哪個頁面
   
    <asp:Content ……>就是要在其中顯示的內容
   


    一在母版頁中編寫後台代碼訪問母版頁中的控件
   
    與普通的aspx頁面一樣雙擊按鈕即可編寫母版頁中的代碼
   
    二在內空頁面中編寫後台代碼訪問內容頁面中的控件
   
    與普通的aspx頁面一樣雙擊按鈕即可編寫母版頁中的代碼
   
    三在內容頁面中編寫代碼訪問母版頁中的控件
   
    在內容頁面中有個Master對象它是MasterPage類型它代表當前內容頁面的母版頁通過這個對象的FindControl方法我們可以找到母版面中的控件這樣就可以在內容頁面中操作母版頁中的控件了
   
    TextBox txt = (TextBox)((MasterPage)Master)FindControl(txtMaster
   
    txtText = thistxtContentText; ;
   
    四在內容頁面中編寫代碼訪問母版頁中的屬性和方法
   
    仍可能通過Master對象進行訪問只不過在這裡要把Master對象轉換成具體的母版頁類型然後再調用母版頁中的屬性和方不法
   
    這裡要說明的是母版頁中要被內容頁面調用的屬性和方法必須是Public修改的否則無法調到
   
    假設母版頁中有下面的屬性和方法
   
    public string TextValue
   
    {
   
    get
   
    {
   
    return thistxtMasterText;
   
    }
   
    set
   
    {
   
    thistxtMasterText = value;
   
    }
   
    }
   
    public void show(string str)
   
    {
   
    txtMasterText = str;
   
    }
   
    在內容頁面中可以通過下代的代碼來實現對母版頁中方法的調用
   
    ((MasterPage_MP)Master)show(thistxtContentText)
   
    ((MasterPage_MP)Master)TextValue = thistxtContentText;

   
    五在母版頁中訪問內容頁面的控件
   
    在母版頁中可以通過在ContentPlaceHolder控件中調用FindControl方法來取得控件然後對控件進行操作
   
    ((TextBox)thisContentPlaceHolderFindControl(txtContent))Text = thistxtMasterText;
   
    六在母版頁中訪問內容頁面中的方法和屬性
   
    在母版頁中調用子頁面中的屬性和方法有點難度因為我們無法像上一步中那樣通過FindControl來找到方法和屬性
   
    於是我們想到在母版面的聲明指示符中加入下面的代碼
   
    <%@ Reference Page=~/MasterPage/Showaspx %>
   
    在運行的時候回發現有錯誤錯誤的內容是無法實現循環引用這是因為默認在子頁面中引用了母版頁你也就不能再在母版頁中引用子頁面了
   
    在網上沒找到更好的解決方法但這使我們想起C#是的反射它可以使我們動態獲取頁面對象並且可以調用它的屬性和方法
   
    代碼如下
   
    Type t = thisContentPlaceHolderPageGetType()
   
    PropertyInfo pi = tGetProperty(ContentValue    //獲取ContentValue屬性
   
    piSetValue(thisContentPlaceHolderPagethistxtMasterTextnull)     //給屬性賦值
   
    MethodInfo mi = tGetMethod(SetValue    //獲取SetValue()方法
   
    object[] os = new object[];    //建造輸入參數
   
    os[] = txtMasterText;
   
    miInvoke(thisContentPlaceHolderPage os)     //調用SetValue方法
   
    七在有多個內容頁面使用母版面的情況下在母版頁中根據不同的內容頁面實現不同的操作
   
    在母版頁中可以加入多個不同的內容頁面但在設計期間我們無法知道當前運行的是哪個內容頁面所以只能通過分支判斷當前運行的是哪個子頁面來執行不同的操作這裡也用到了反射的知識
   
    代碼如下
   
    string s = thisContentPlaceHolderPageGetType()ToString()    //取出內容頁面的類型名稱
   
    if (s == ASPdefault_aspx)    //根據不同的內容頁面類型執行不同的操作
   
    {
   
    ((TextBox)thisContentPlaceHolderFindControl(TextBox))Text = MastPage;
   
    }
   
    else if (s == ASPdefault_aspx
   
    {
   
    ((TextBox)thisContentPlaceHolderFindControl(TextBox))Text = Hello MastPage;
   
    }
   
    八在母版面與內容頁面中JS代碼的操作
   
    在母版頁或內容頁面中的控件運行之後會自動生成ID如文本框的ID是txtContent在運行之後ID會自動變為 ctl_ContentPlaceHolder_txtContentname屬性會變為 ctl$ContentPlaceHolder$txtContent
   
    在JS代碼中我們用documentgetElementById()方法根據id取得控件對象的時候應當使用ctl_ContentPlaceHolder_txtContent這個ID名否則會產生未找到對象的異常
   
    母版頁運行機制
   
    母版頁僅僅是一個頁面模板單獨的母版頁是不能被用戶所訪問的單獨的內容頁也不能夠使用母版頁和內容頁有著嚴格對應關系母版頁中包含多少個 ContentPlaceHolder控件那麼內容頁中也必須設置與其相對應的Content控件當客戶端浏覽器向服務器發出請求要求浏覽某個內容 頁面時ASPNET引擎將同時執行內容頁和母版頁的代碼並將最終結果發送給客戶端浏覽器
   
    母版頁和內容頁的運行過程可以概括為以下個步驟
   
    ()用戶通過鍵入內容頁的URL來請求某頁
   
    ()獲取內容頁後讀取@ Page指令如果該指令引用一個母版頁則也讀取該母版頁如果是第一次請求這兩個頁則兩個頁都要進行編譯
   
    ()母版頁合並到內容頁的控件樹中
   
    ()各個Content控件的內容合並到母版頁中相應的ContentPlaceHolder控件中
   
    ()呈現得到結果頁
   
    母版頁和內容頁事件順序
     
    ()母版頁中控件Init事件
   
    ()內容頁中Content控件Init事件
   
    ()母版頁Init事件
   
    ()內容頁Init事件
   
    ()內容頁Load事件
   
    ()母版頁Load事件
   
    ()內容頁中Content控件Load事件
   
    ()內容頁PreRender事件
   
    ()母版頁PreRender事件
   
    ()母版頁控件PreRender事件
   
    ()內容頁中Content控件PreRender事件
   
    使用母版頁的優點
   
    ()有利於站點修改和維護降低開發人員的工作強度
   
    ()有利於實現頁面布局
   
    ()提供一種便於利用的對象模型


From:http://tw.wingwit.com/Article/program/net/201311/12797.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.