Aspx頁面生命週期

頁面被請求時,第一個被執行的老是構造函數(constructor). 你能夠在這裏初始化不少自定義屬性或對象。不過這裏有一些限制,由於 page 尚未被徹底初始化。特別地,你必須使用 HttpContext.Current 來訪問 QueryString, Form, Cookies 集合,以及 Cache 對象。而 Session 對象在 constructor 裏是沒法訪問的。javascript

下面接着執行的是 AddParsedSubObject 方法,這個方法把組成該 page 的全部子控件添加到控件集合樹中。在不少高級的頁面模板解決方案中,該方法一般被覆蓋,以便把頁面的控件添加到一個特殊的頁面模板中去。該方法遞歸的被子控件調用,全部這些子控件都是這時候初始化的,從最裏面的開始。html

接着是 DeterminePostBackMode 方法。該方法容許你影響 IsPostBack 的值,以及相關事件。若是你想從數據庫中加載 ViewState 以便 redirect 時,這個可能對你有用。由於 ViewState 僅僅在 IsPostBack 爲 true 的時候被恢復。
你能夠經過返回 null 來強制不 postback, 或者返回 Request.Form 來強制 postback. 這個方法是不推薦使用的,除非是在特殊的狀況下,由於他還影響其餘的事件。java

而後是 OnInit 方法。一般這是咱們使用到的第一個方法。這時,全部控件已經被初始化,也就是說全部原始值都被設定了。而 ViewState 以及全部其餘 post 的值尚未被應用到控件上。也就是說這時候全部經過代碼或者用戶操做作的更改尚未被恢復。這一般是建立或從新建立動態控件的最佳時機。數據庫

恢復和加載(Restore and Load)瀏覽器

接下來的 LoadPageStateFromPersistenceMedium 方法,僅僅在 PostBack 時被執行。當你要改變保存 ViewState 的方法時(使用 Session 或其餘自定義的儲存方法),覆蓋這個方法,以及後面的 SavePageStateToPersistenceMedium 方法。注意:該方法並不真正加載 ViewState 到 page 及其子控件。服務器

ViewState 被取回後,接着 LoadViewState 方法將它們恢復到 page, 並遞歸的恢復到每個子控件(只有 PostBack 的那些).這時,每一個控件已經被恢復到了它上次執行時的狀態,但用戶 post 的值尚未被應用。由於這屬於 ViewState. 這個方法是恢復全部在事件中建立的動態控件的最好時機。asp.net

下一個是 ProcessPostData 方法。僅僅在 PostBack 時被執行。並且這個方法不能被覆蓋,由於它是頁面基類中實現的一個私有方法。這個方法最終將用戶 post 的值,經過匹配控件的名稱的方法,恢復到頁面。這時,page 已經被徹底恢復了。動態控件必須在這個方法以前被建立。這個方法同時也爲稍後的 changed 事件記錄控件值的改變。函數

而後纔是 OnLoad 方法。大部分的代碼中都使用這個方法,由於這是在 page 的生命週期中,第一個全部的值都被恢復了的地方。咱們能夠經過檢查 IsPostBack 屬性來避免沒必要要的重設狀態。同時也能夠檢查 IsValid 屬性來進行驗證。同時還能夠在這裏建立動態控件。全部這些控件的方法都會被執行並捕獲,包括 ViewState. 但回發的值不能夠。post

Raised Eventsspa

下一個方法,ProcessPostData 方法, 其實是前面那個方法的第二個入口(second pass)。它僅僅處理回發,並且因爲是私有方法,因此不能被覆蓋。這個方法顯得有些奇怪,但又是必要的。由於在 OnLoad 方法中重建的動態控件須要他們回發的值。全部在這個方法以後建立的動態控件,將只能恢復 ViewState, 而不能恢復回發的值,而且不能觸發任何更改事件。

下一個方法, RaiseChangedEvents, 一樣僅僅用於回發時。它是一個基類實現的私有方法。這時 changed 事件被真正觸發。這基於前面 ProcessPostData 方法中標註出回發的值的差別。當有多個 changed 事件被觸發時,其前後順序是沒有保證的。

下面是 RaisePostBackEvent 方法。僅用於回發,並且是基類實現的私有方法。這是真正提交 form 的方法,除非是 postback。好比按鈕,或者其餘經過 javascript 提交的控件被觸發。若是使用了 Validators, 如沒有手動調用 Validate 方法,這時也已經被調用了。有時候 ie 的 bug 會使得表單被提交,而不引起事件。

接着是 OnPreRender 方法。這一般是在被繪製到瀏覽器以前,要更改 page 及其子控件的最後機會。你也能夠在這裏建立動態控件。但這時只能捕獲 ViewState, 而不能接受 posted values, 並且沒有事件。由於上面提到的 ie 的 bug, 這裏能夠用來捕獲沒有觸發事件的 post back.

保存和繪製(Save and Render)

下一個是 SaveViewState 方法。 不論是否 post back. 遞歸的應用到每個子控件。ViewState 通常保存全部和 aspx 頁面裏不同的屬性,不論是被代碼仍是用戶更改的。注意,因爲控件的值是經過他們在控件樹中的位置來保存的,因此若是在這以後添加動態控件到錯誤的位置, ViewState 可能會崩潰。

下面是 SavePageStateToPersistenceMedium 方法。它真正的保存 page 的 ViewState. 這個方法可覆蓋。若是重寫的話,注意這裏因爲 asp.net 的 bug, 須要手工設定一下 __VIEWSTATE,哪怕是空值。

接着是 Render 方法。它遞歸的調用到每一個子控件,真正的繪製各自的 html, 發送到瀏覽器。在一些頁面模板方案中,經常在這裏添加通用的 header 和 footer. 而不用使用服務器控件。 注意在這裏能做的更改必須是純的 html. 由於這時候控件都已經繪製完了。

最後是 OnUnload 方法。它調用了 Dispose 方法。這個方法能夠用來清理頁面中使用的非託管資源。特別是相似於關閉打開的文件或數據庫鏈接等。該方法只有當頁面已經被髮送到客戶端瀏覽器後才發生。因此它只能對服務端的對象起做用。因此他不能在 page 的 trace 中被顯示。

上面就是 page 的生命循環。每次有一個新的請求時,以上過程就重複一次。

相關文章
相關標籤/搜索