根據Lutz Roeder的Reflector對System.Web.dll的反編譯,下面是HttpApplication,Page和Control對象的主要方法和事件的流程
PostBack | |
Page/Control Event | |
CallBack |
頁面框架通過如下過程處理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):
頁面首先調用自身的OnLoad方法以引發自身的Load事件,接着遞歸調用Controls集合中控件的OnLoad方法以引發它們的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):
頁面調用OnLoadComplete方法來引發LoadComplete事件,這表示所有加載活動,包括加載回傳數據,以及引發回傳數據修改事件,並以更新控件自身的活動都完成了。
15:引發回調事件(Raise CallBack Event)(PostBack And CallBack Only):
頁面調用控件的RaiseCallBackEvent方法。該控件可使用AspNet客戶端回調機制來允許客戶端方法(例如JavaScript函數)調用服務器端方法,而無需將整個頁面回傳給服務器。
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標記文本。