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