ASP.NET一個頁面的生命周期


在學習ASP.NET頁面生命周期前,需要先了解之前的ASP.NET的基本運行機制,在理解ASP.NET基本運行機制原理后,下面將介紹ASP.NET的生命周期中,頁面從創建到處理結束的過程中ASP.NET Engine執行的10個事件.

1.對象初始化

     頁面自身以及頁面中的控件,都是在Form中被首次初始化的,初始化事件可以通過OnInit()方法重載.通過在ASPX頁面的后台代碼文件的構 造器中聲明對象,頁面將知道對象的類型,並知道需要創建多少個這樣的對象.一旦在構造器中聲明了控件,就可以在其任何子類 事件 方法 或屬性中訪問到它們.但是,如果對象實在ASPX文件中指定的控件,由於這樣的控件是沒有屬性的,並且這樣做對從代碼中訪問它們是危險的,所以無法保證這 些控件實例是按照怎樣的順序被創建的.

2.加載視圖狀態數據

     初始化之后,因為還沒有建立用於相對引用的文檔對象模型,所以控件僅能通過ID引用.在LoadViewState事件中,已初始化的控件獲得第一 個屬性,即上一次提交存留到服務器的視圖狀態信息.頁視圖狀態通過ASP.NET維護,通常被用於在一個往返行程中存留信息到服務器.視圖狀態信息以一個 名稱/值對的形式進行保存,它包含控件的Text和Value這一類信息.視圖信息在頁請求中進行傳遞,通常保存在隱藏<input>控件的 值屬性中.這個事件可以通過LoadViewState()方法重載,往往用於在控件被填充時定制它所接受的數據.

3.LoadPostData處理回傳數據

     在創建頁的階段,被發送到服務器端的Form數據(也被稱為回傳數據)依照每個控件的數據需求進行處理.當頁面提交Form時,框架將在每個提交數 據的控件上實現IPostBackDataHandler接口.隨后,頁面激發LoadPostData事件,通過頁面解析發現實現了 IPostBackDataHandler接口的控件,並用正確的回傳數據更新控件狀態.ASP.NET更新正確的控件是通過匹配控件的唯一標示符來實現 的,該標識符具有名稱值集合中的名稱值對.

  注意:在所有特定的頁中,每個控件都需要一個唯一標示符.框架來完成其它的步驟,以確定每個標示符在環境中是唯一的.例如,存在於單頁面中的自定義用戶控件.LoadPostData事件被激發后,RaisePostDataChanged事件就可以隨時被執行了.

4.對象加載

     大部分的工作都是在這一階段完成的.對象在load事件中獲得正確的Form,Load事件能夠通過調用OnLoad()方法來重載.首先,所有的 對象都被組織在頁DOM(也稱為控件樹)中,並且很容易通過代碼或相對位置來引用.然后對象就可以自由地訪問HTML中的客戶端屬性集,如width value或者visibility.當加載時,控件邏輯(如算法)以編程方式設置控件屬性.用StringBuilder裝配輸出字符串都同時被執行.


5.激發RaisePostDataChanged事件

     如前所述,這發生在所有實現了IPostBackDataHandler接口的控件被正確的回傳數據更新以后.在這個過程中,每個控件都有一個布爾值的 標識,標識其自上一次提交后該控件的數據是否被修改.然后ASP.NET通過搜索頁來尋找任何顯示控件數據被更改的標識,並激發 RaisePostDataChanged事件.

  注意:這個事件知道Load事件發生后,所有控件被更新后才激發.這個機制可以保證在控件被回傳數據更新前,其它控件的數據在RaisePostDataChanged事件中沒有被手動更改過.

6.處理客戶端回傳事件

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

7.對象預呈現

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

8.保存視圖狀態

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

9.呈現HTML

    頁 的創建是通過Render事件裝配用於瀏覽器輸出的HTML來進行的,Render事件可以被重載.在Render事件中,頁調用對象使它們呈現為 HTML,然后頁手機HTML來進行發送.當Render事件被重載的時候,程序員可以為瀏覽器創建定制的HTML,此時頁面創建的任何HTML都還沒有 生效.Render()方法用HTMLTextWriter對象作為參數,並由它產生HTML給瀏覽器.這里仍然可以作修改,但是這樣的修改只會反映到客 戶,也就是說,改變只會在HTML呈現中反映,而視圖狀態並無法改變.

10.釋放

  當呈現頁面的HTML后,對象將被釋放.在Dispose事件中,我們可以清楚任何在頁面中創建中構造的對象或者引用.在這里,所有的處理都已經被執行,程序員可以安全地釋放任何還存在的對象,包括Page對象.

  在 ASP.NET的頁面生命周期中需要經歷 Page_Init,LoadViewState,LoadPostData,Page_Load,RaisePostDataChanged,RaisePostBackEvent,Page_PreRender,SaveViewState,Page_Render,UnLoad 這10個事件.每一個ASP.NET頁面生命周期,都經歷着同樣的過程:從初始化對象到銷毀對象.通過了解ASP.NET頁面的生命周期,我們可以在編寫 調試代碼的時候更好的地把握這些事件之間的關系.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM