模板頁和內容頁的運行機理

在加載母版頁和內容頁共需要經過8個過程。這8個過程顯示初始化和加載母版頁及內容頁是一個相互交疊的過程。基本過程是,初始化母版頁和內容頁控件樹,然後,初始化母版頁和內容頁頁面,接着,加載母版頁和內容頁,最後,加載母版頁和內容頁控件樹。以上8個過程對應着11個具體事件。這些事件如下所示。    

  (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事件。
    實際上,8個過程或者是11個事件都用於說明母版頁和內容頁中的具體事件順序。內容頁和母版頁中會引發相同的事件。例如,兩者都引發Init、Load和PreRender事件。引發事件的一般規律是,初始化Init事件從最裏面的控件(母版頁)向最外面的控件(Conetent控件及內容頁)引發,所有其他事件則從最外面的控件向最裏面的控件引發。需要牢記,母版頁會合併到內容頁中,並被視爲內容頁中的一個控件,這一點十分有用。
    在創建應用程序中,必須注意以上事件順序。例如,當在內容頁中訪問母版頁的屬性或者服務器控件時,如果按照過去的處理思路,可能會在內容頁的Page_Load事件處理程序中加以實現。由前文可知,在母版頁Load事件引發之前,內容頁Load事件已經引發,那麼過去的思路顯然是不正確的。如何才能在內容頁中訪問母版頁包含對象呢?可參考“5.5訪問母版頁控件和屬性”一節中介紹的實現方法。


附錄:
母版頁判斷登陸 及 母版頁與內容頁的執行順序 
在checkLogin.cs裏有check方法:
public static void check(Page aPage)
    {
        if (aPage.Session["ok"] == null || aPage.Session["ok"].ToString() != "ok")
        {
            aPage.Response.Redirect("login.aspx");
        }
    }
在母版頁裏調用的正確方法:
protected void Page_Init(object sender, EventArgs e)
    {
        checkLogin.check(this.Page);
    }
原因:
母版頁和內容頁的執行順序:
母版頁中控件的Init->內容頁控件的Init->母版頁的Init->內容頁的Init
->內容頁的Load->母版頁的Load->內容頁中控件的Load
->內容頁的PreRender->母版頁的PreRender->母版頁控件的PreRender->內容頁中控件的PreRender
出錯方法:
1、checkLogin.check(mypage);
運行:MasterPage類轉Page類出錯
2、Page mypage=new Page();
checkLogin.check(mypage);
運行:System.Web.HttpException: 響應在此上下文中不可用。
3、用戶自定義控件MasterPublicMethod.ascx,調用檢查方法
protected void Page_Load(object sender, EventArgs e)
    {
        checkLogin.check(this.Page);
    }
控件加入母版頁:<uc1:MasterPublicMethod id="MasterPublicMethod1" runat="server"></uc1:MasterPublicMethod>
這個方法改成:在母版頁的Page_Load事件裏:checkLogin.check(this.Page);
運行:正常
出錯原因:事件執行順序:內容頁的Page_Load事件->母版頁的Page_Load事件,要在頁面最開始檢查有沒有登錄
4、母版頁:
protected void Page_Load(object sender, EventArgs e)
    {
        //Response.Write("母版");
        checkLogin.check(this.Page);
    }
內容頁的Page_LoadComplete事件:
protected void Page_LoadComplete(Object sender, EventArgs e)
    {
        int t, bid;
        //初始化自定義控件用的參數
        pg = Convert.ToInt32(Request.QueryString["pg"]);
        bid = Convert.ToInt32(Request.QueryString["id"]);
        t = Convert.ToInt32(Request.QueryString["t"]);
        switch (t)
        {
            case 1:
                //回覆
                break;
            case 2:
                //修改回覆
                break;
            case 3:
                //隱藏
                HideBook(bid);
                break;
            case 4:
                //刪除
                DelBook(bid);
                break;
        }
    }
修改原因:頁面執行順序:內容頁的Page_Load->母版頁的Page_Load->內容頁的Page_LoadComplete
運行:自定義控件裏有變量未賦值出錯
出錯原因:有的內容頁裏有自定義控件,自定義控件的Page_Load事件裏有代碼,自定義控件的參數在內容頁的Page_LoadComplete事件裏初始化
Page_Load的執行順序:內容Page_Load->母版Page_Load->自定義控件Page_Load->內容Page_LoadComplete
發佈了26 篇原創文章 · 獲贊 5 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章