AspNet2.0頁面生命週期
頁面框架通過如下過程處理aspx檔案請求:
1:解析aspx檔案,並建立一個控制元件樹;
2:使用控制元件樹動態實現一個繼承自Page類的類或者控制元件 ;
3:動態編譯類;
4:快取編譯類,以備後用;
5:動態建立一個編譯類的例項。頁面開始啟動生命期,在這個過程中,頁面將通過生命週期的不同階段;
01:頁面首先從QueryString或者Request物件的Form集合中獲得回傳資料。
02:頁面檢測回傳資料集合(NameValueCollection,Form或者QueryString)是否包含一個鍵為_CallBackId的項。如 果存在,那麼設定其Boolean屬性IsCallBack為True,以便通過AspNet客戶端回撥機制,標明頁面已經回傳到伺服器。
03:預初始化(PreInit):
在頁面生命週期的預初始化階段執行如下操作:
a:呼叫OnPreInit方法引發PreInit事件。
b:利用App_Themes目錄中的內容初始化主題,以動態實現一個PageTheme型別的類,
編譯該類,並建立一個編譯類的例項,接著將例項賦值給它的PageTheme屬性值
c:應用母版頁
04:初始化(Init):
在頁面生命週期的初始化階段執行以下操作
a:遞迴初始化Controls集合中的控制元件。初始化包括設定這些控制元件的屬性,
例如:Page,Id和NameContainer等
b:遞回應用控制元件皮膚
c:呼叫OnInit方法以引發自身的Init事件,接著遞迴呼叫子控制元件的OnInit方法來引發它們的Init事件
d:呼叫自身的TrackViewState方法來啟動自身的檢視狀態跟蹤,接著遞迴呼叫子控制元件
的TrackViewState方法來啟動它們的檢視狀態跟蹤。
05:完成初始化(InitComplete):
頁面呼叫OnInitComplete方法來引發InitComplete事件。該事件標明瞭初始化階段的結束。
此時,頁面Controls集合的所有控制元件都被初始化了。
06:載入控制元件狀態(Load Control State)[PostBack Only]:
頁面遞迴呼叫Control集合中控制元件的LoadControlState方法,這些控制元件已經呼叫了Page類
的RegisterRequiresControlState方法,以使用它們的控制元件狀態。
07:載入檢視狀態(Load View State)[PostBack Only]:
頁面首先呼叫自身的LoadViewState方法,接著遞迴呼叫Controls集合控制元件的LoadViewState方法,以允許它們載入它們的已經儲存的檢視狀態。
08:載入回傳資料(Load Post Data)[PostBack Only]:
頁面呼叫實現IPostBackDataHandler介面的控制元件的LoadPostData方法,並將回傳資料傳遞給該方法。每個控制元件的LoadPostDate方法都必須訪問回傳資料,並據此更新相應的控制元件屬性。
例如:TextBox控制元件的LoadPostData方法將文字框的新值設定為TextBox控制元件的Text屬性值。
09:預載入(PreLoad):
頁面呼叫OnPreLoad方法以引發PreLoad事件。該事件表示頁面生命週期將進入載入階段。
10:載入(Load):
頁面首先呼叫自身的方法以引發自身的Load事件,接著遞迴呼叫Controls集合中控制元件的方法以引發它們的Load事件。頁面開發人員可以為Load事件註冊回撥,那麼就可以通過程式設計將子控制元件新增到頁面的Controls集合中。
11:載入回傳資料(Load Post Data)[PostBack Only Second Try]:
頁面呼叫控制元件的LoadPostBack方法。這些控制元件如果實現了IPostBackDataHandler介面,那麼在載入階段,它們已通過程式設計新增到Controls集合中。
12:引發回傳資料修改事件(Raise Post Data Changed Event)[PostBack Only]:
頁面呼叫控制元件的RaisePostDataChangeEvent方法,這些控制元件的LoadPostData方法返回true。
RaisePostDataChangeEvent方法引發了回傳資料修改事件。例如:當文字框的新值與舊值
不同時,那麼TextBox控制元件將引發該事件。
13:引發回傳事件(Raise PostBack Event)[PostBack Only]:
頁面呼叫控制元件的RaisePostEvent方法,這些控制元件相關的Html元素用於提交表單。例如,Button控制元件的相關Html元素將頁面回傳到伺服器。控制元件的RaisePostBackEvent方法必須將回傳事件對映到一個或多個伺服器事件。例如,Button控制元件的 RaisePostBackEvent方法將事件對映到了伺服器端事件Command和Click上。
14:完成載入(Load Complete):
頁面呼叫Complete方法來引發LoadComplete事件,這表示所有載入活動,包括載入回傳資料,以及引發回傳資料修改事件,並以更新控制元件自身的活動都完成了。
15:引發回撥事件(Raise CallBack Event)(PostBack And CallBack Only):
頁面呼叫控制元件的RaiseCallBackEvent方法。該控制元件可使用AspNet客戶端回撥機制來允許客戶端方法(例如Java函式)呼叫伺服器端方法,而無需將整個頁面回傳給伺服器。
RaiseCallBackEvent方法必須呼叫伺服器端方法。如果頁面的回傳使用了客戶端回撥機制,那麼頁面將不會執行剩餘的頁面生命週期階段。
16:預呈現(PreRender):
在頁面生命週期這個階段執行一下操作。
a:呼叫EnsureChildControls方法來確保在頁面進入呈現階段之前,建立其子控制元件。
b:呼叫自身的OnPreRender方法來引發PreRender事件。
c:遞迴呼叫Controls集合中控制元件的OnPreRender方法,以引發它們的PreRender事件。
17:預呈現完成(PreRender Complete):
頁面呼叫OnPrerenderComplete方法來引發PreRenderComplete事件,這表示所有預呈現活動完成了。
18:儲存控制元件狀態(Save Control State):
頁面遞迴呼叫Controls集合中控制元件的SaveControlState方法。這些控制元件已經呼叫了Page類的RegisterRequiresControlState方法來儲存它們的控制元件狀態。
19:儲存檢視狀態(Save View State):
頁面首先呼叫自身的SaveViewState方法,然後呼叫Controls集合中的SaveViewState方法,以允許它們來儲存其檢視狀態。
20:儲存狀態完成(Save View Complete):
頁面呼叫OnSaveStateComplete方法以引發SaveStateComplete事件,這表示所有狀態儲存活動都完成了。
21:呈現:
在頁面生命週期的這個階段執行一下操作。
a:建立一個HtmlTextWriter類例項,該例項封裝了輸出響應流
b:呼叫RenderCOntrol方法,並將HtmlTextWriter例項傳遞給該方法。
RenderControl方法遞迴呼叫子控制元件的RenderControl方法,以便允許每個控制元件能夠呈現其
Html標記文字。子控制元件的Html標記文字組成了最終傳送給客戶端瀏覽器的Html標記文字。