ASP.Net頁面生命週期(3,純文本形式)

 

當一個頁面請求被髮送到WEB服務器,不論該事件是由頁面提交還是由頁面重定向而激發的,頁面在其被創建到釋放的過程中都會運行一系列的 事件。當我們創建ASP.NET頁的時候往往沒有關注它的執行週期,從而讓我們碰到很多讓自己頭疼的問題。但是,如果被正確的使用和操縱,頁 生命週期會成爲一個高效且強大的工具。很多開發者都認識到,理解頁面執行過程中發生了什麼和什麼時候發生對高效編寫ASP.NET頁和用戶控 件是十分關鍵的。那麼,讓我們來詳細的瞭解一個ASP.NET頁面從被創建到其被釋放的過程中的十個事件。我將把這個過程建立在一個用C#編寫的ASP.NET簡單提交頁上。這個頁面首次會加載一些服務器端WEB控件,當WEB服 務器接收到它的請求時,WEB服務器就會處理我們的WEB控件並最終讓我們得到該頁的HTML呈現。處理頁面的第一步是對象初始化。­

­

1.對象初始化­  (ld:11月4號理解,服務器自動加載頁)

頁面中的控件(包括頁面本身)都是在它們最初的FORM中被首次初始化的。通過在ASPX頁面的後臺代碼文件的構造器中聲明你的對象,頁面將知 道對象的類型,並知道需要創建多少個這樣的對象。一旦你在構造器中聲明瞭你的控件,你就可以在它的任何子類,方法,事件或者屬性中訪 問到它們。但是,如果你的任何對象是在ASPX文件中指定的控件,這樣的控件是沒有屬性的。而且這樣做對從代碼中訪問它們是危險的,因爲 無法保證這些控件實例是按照怎樣的順序被創建的(假定它們都是能完全被創建的)。初始化事件可以通過OnInit方法重載。­

­

2.加載視圖狀態數據­(ld:加載上一次提交的視圖狀態數據)

初始化以後,控件僅能通過ID引用(還沒有建立用於相對引用的文檔對象模型)。 在LoadViewState事件中,已初始化的控件獲得第一個屬性: 上一次提交存留到服務器的視圖狀態信息。頁視圖狀態通過ASP.NET維護,它被用於在一個往返行程中存留信息到服務器。視圖狀態信息被保存 爲一個名稱/值對,它包含控件的如Text和Value一類的信息。視圖信息被保存在隱藏<input>控件的值屬性中在頁請求中傳遞。正如你所瞭解的 ,這是舊的ASP3.0狀態維護技術的一個巨大飛躍。這個事件可以通過LoadViewState方法重載,往往用來在控件被填充時定製它所接受的數據。­

­

3.LoadPostData處理回傳數據­ (ld:接受從視圖狀態中或操作頁面中重操作傳來的數據)

在創建頁的階段,被髮送到服務器端的Form數據(ASP.NET中的術語爲回傳數據)依照每個控件的數據需求進行處理。當頁面提交Form時,框架將 在每個提交數據的控件上實現IPostBackDataHandler接口。頁面然後激發LoadPostData事件,通過頁面解析發現實現了 IPostBackDataHandler 接口的控件,並用正確的回傳數據更新控件狀態。ASP.NET通過匹配控件的唯一標示符來更新正確的控件,該標示符具有名稱值集合中的名稱值 對。這也就是在所有特定的頁中每個控件都需要一個唯一標示符的原因之一。其它的步驟都由框架來完成,以確定每個標示符在環境中是唯一的,例如存在於單頁面 中的自定義用戶控件。LoadPostData事件被激發後,RaisePostDataChanged事件就可以隨時被執行了。­

­

4.對象加載­  (ld:組織在DOM樹中,設置控件的屬性)

對象在­

5.激發RaisePostDataChanged事件­ (ld若在着重新更改數據,那麼此事件標記更改的控件標誌   號)

如前所述,這發生在所有Load事件中獲得正確的Form。所有的對象首先都被組織在頁DOM(ASP.NET中稱爲控件樹)中,並且很容易通過代碼或者相對位置(crawling the DOM)來引用。然後對象就可以自由的訪問HTML中的客戶端屬性集,例如width,value,或者visibility。加載時,控件邏輯,如算法、以編 程方式設置控件屬性、用StringBuilder裝配輸出字符串都同時被執行。大部分的工作都是在這一階段完成的。Load 事件能夠通過調用OnLoad來重載。­實現了IPostBackDataHandler接口的控件被正確的回傳數據更新以後。在這個過程中,每個控件都有一個布爾值的標 識,標識其自上一次提交後該控件的數據是被更改還是保持原值。然後ASP.NET通過搜索頁來尋找任何顯示控件數據被更改的標識並激發­

RaisePostDataChanged。RaisePostDataChanged事件直到Load事件發生後,所有控件被更新後才激發。這保證了在控件被回傳數據更新前,其它控件的數據在RaisePostDataChanged事件中沒有被手動更改過。­

­

6.處理客戶端回傳事件­(ld:服務器又次接受上事件的數據)

當回傳更新導致數據改變而引發服務器端事件後,引發回傳的對象會在RaisePostBackEvent事件中被處理。這種激發回傳的對象往往是其狀態改 變而引發回傳的控件(其autopostback被啓用)或者是一個被點擊的窗體提交按鈕。很多代碼都在這個事件中執行,因爲這是控制事件驅動邏輯的理想 位置。爲了保證呈現到瀏覽器的數據的正確性,在一系列的回傳事件後RaisePostBackEvent事件最終被激發。基於一致性的考慮,回傳中改變的 控件直到這個函數被執行後才被更新。也就是說,被預期事件改變的數據總是在結果頁反映出來。RaisePostBackEvent事件可以通過 RaisePostBackEvent來捕捉。­

­

7.對象預呈現­  (ld:最後一次可以改變保存到視圖狀態的對象)

對象被預呈現的地方對於那些能夠保存到視圖或者維持其視圖狀態的對象來說是最後一次有機會改變的地方。這使得預呈現步驟成爲做最後修改的理想位置,例如改 變控件屬性或改變控件樹結構,不用擔心因爲數據庫請求或者視圖狀態更新而導致對象的變化。預呈現階段之後,對象改變被鎖定並且不能再被保存到頁視圖狀態 中。預呈現階段可以通過重載OnPreRender實現。­

­

8.保存視圖狀態­

只有在所有的頁面對象的改變都發生後視圖狀態才被保存。對象狀態數據被保存在隱藏<input>對象中,這也是對象狀態數據準備呈現到 HTML的地方。在SaveViewState事件中,值能夠被保存到視圖狀態對象中,但頁面控件的改變並不能保存到其中。可以通過重載 SaveViewState實現這個步驟。­

­

9.呈現HTML­

Render事件通過裝配用於瀏覽器輸出的HTML來着手頁的創建。在Render事件中,頁調用對象使它們呈現爲HTML,然後頁收集HTML來發送。 當Render事件被重載的時候,開發者可以爲瀏覽器創建定製的HTML,此時頁面創建的任何HTML都還沒有生效。Render 方法用HtmlTextWriter對象作參數並由它產生HTML給瀏覽器。這裏仍然可以作修改,但是這樣的修改只會反映到客戶(譯者注:意即改變只會在 HTML呈現中反映而視圖狀態並無法被改變)。Render 事件可以被重載­

­

10.釋放­

當頁面的HTML呈現後,對象被釋放。在Dispose事件中,你可以清除任何在頁面創建中構造的對象或者引用。在這裏,所有的處理都已經被執行,你可以安全的釋放任何還存在的對象,包括Page對象。­

­

Dispose能被重載具體對應的事件順序如下:­

Page_Init()­

LoadViewState­

LoadPostData­

Page_Load()­

RaisePostDataChanged­

RaisePostBackEvent­

Page_PreRender()­

SaveViewState­

Page_Render()­

UnLoad­
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章