1.對象初始化
頁面中的控件(包括頁面本身)都是在它們最初的FORM中被首次初始化的。通過在ASPX頁面的后臺代碼文件的構造器中聲明你的對象,頁面將知道對象的類型,并知道需要創(chuàng)建多少個這樣的對象。一旦你在構造器中聲明了你的控件,你就可以在它的任何子類,方法,事件或者屬性中訪問到它們。但是,如果你的任何對象是在ASPX文件中指定的控件,這樣的控件是沒有屬性的。而且這樣做對從代碼中訪問它們是危險的,因為無法保證這些控件實例是按照怎樣的順序被創(chuàng)建的(假定它們都是能完全被創(chuàng)建的)。初始化事件可以通過OnInit方法重載。
2.加載視圖狀態(tài)數(shù)據(jù)
初始化以后,控件僅能通過ID引用(還沒有建立用于相對引用的文檔對象模型)。在LoadViewState事件中,已初始化的控件獲得第一個屬性:上一次提交存留到服務器的視圖狀態(tài)信息。頁視圖狀態(tài)通過ASP.NET維護,它被用于在一個往返行程中存留信息到服務器。視圖狀態(tài)信息被保存為一個名稱/值對,它包含控件的如Text和Value一類的信息。視圖信息被保存在隱藏<input>控件的值屬性中在頁請求中傳遞。正如你所了解的,這是舊的ASP3.0狀態(tài)維護技術的一個巨大飛躍。這個事件可以通過LoadViewState方法重載,往往用來在控件被填充時定制它所接受的數(shù)據(jù)。
3.LoadPostData處理回傳數(shù)據(jù)
在創(chuàng)建頁的階段,被發(fā)送到服務器端的Form數(shù)據(jù)(ASP.NET中的術語為回傳數(shù)據(jù))依照每個控件的數(shù)據(jù)需求進行處理。當頁面提交Form時,框架將在每個提交數(shù)據(jù)的控件上實現(xiàn)IPostBackDataHandler接口。頁面然后激發(fā)LoadPostData事件,通過頁面解析發(fā)現(xiàn)實現(xiàn)了IPostBackDataHandler 接口的控件,并用正確的回傳數(shù)據(jù)更新控件狀態(tài)。ASP.NET通過匹配控件的唯一標示符來更新正確的控件,該標示符具有名稱值集合中的名稱值對。這也就是在所有特定的頁中每個控件都需要一個唯一標示符的原因之一。其它的步驟都由框架來完成,以確定每個標示符在環(huán)境中是唯一的,例如存在于單頁面中的自定義用戶控件。LoadPostData事件被激發(fā)后,RaisePostDataChanged事件就可以隨時被執(zhí)行了。
4.對象加載
對象在Load事件中獲得正確的Form。所有的對象首先都被組織在頁DOM(ASP.NET中稱為控件樹)中,并且很容易通過代碼或者相對位置(crawling the DOM)來引用。然后對象就可以自由的訪問HTML中的客戶端屬性集,例如width,value,或者visibility。加載時,控件邏輯,如算法、以編程方式設置控件屬性、用StringBuilder裝配輸出字符串都同時被執(zhí)行。大部分的工作都是在這一階段完成的。Load 事件能夠通過調用OnLoad來重載。
5.激發(fā)RaisePostDataChanged事件
如前所述,這發(fā)生在所有實現(xiàn)了IPostBackDataHandler接口的控件被正確的回傳數(shù)據(jù)更新以后。在這個過程中,每個控件都有一個布爾值的標識,標識其自上一次提交后該控件的數(shù)據(jù)是被更改還是保持原值。然后ASP.NET通過搜索頁來尋找任何顯示控件數(shù)據(jù)被更改的標識并激發(fā)
RaisePostDataChanged。RaisePostDataChanged事件直到Load事件發(fā)生后,所有控件被更新后才激發(fā)。這保證了在控件被回傳數(shù)據(jù)更新前,其它控件的數(shù)據(jù)在RaisePostDataChanged事件中沒有被手動更改過。
6.處理客戶端回傳事件
當回傳更新導致數(shù)據(jù)改變而引發(fā)服務器端事件后,引發(fā)回傳的對象會在RaisePostBackEvent事件中被處理。這種激發(fā)回傳的對象往往是其狀態(tài)改變而引發(fā)回傳的控件(其autopostback被啟用)或者是一個被點擊的窗體提交按鈕。很多代碼都在這個事件中執(zhí)行,因為這是控制事件驅動邏輯的理想位置。為了保證呈現(xiàn)到瀏覽器的數(shù)據(jù)的正確性,在一系列的回傳事件后RaisePostBackEvent事件最終被激發(fā)?;谝恢滦缘目紤],回傳中改變的控件直到這個函數(shù)被執(zhí)行后才被更新。也就是說,被預期事件改變的數(shù)據(jù)總是在結果頁反映出來。RaisePostBackEvent事件可以通過RaisePostBackEvent來捕捉。
7.對象預呈現(xiàn)
對象被預呈現(xiàn)的地方對于那些能夠保存到視圖或者維持其視圖狀態(tài)的對象來說是最后一次有機會改變的地方。這使得預呈現(xiàn)步驟成為做最后修改的理想位置,例如改變控件屬性或改變控件樹結構,不用擔心因為數(shù)據(jù)庫請求或者視圖狀態(tài)更新而導致對象的變化。預呈現(xiàn)階段之后,對象改變被鎖定并且不能再被保存到頁視圖狀態(tài)中。預呈現(xiàn)階段可以通過重載OnPreRender實現(xiàn)。
8.保存視圖狀態(tài)
只有在所有的頁面對象的改變都發(fā)生后視圖狀態(tài)才被保存。對象狀態(tài)數(shù)據(jù)被保存在隱藏<input>對象中,這也是對象狀態(tài)數(shù)據(jù)準備呈現(xiàn)到HTML的地方。在SaveViewState事件中,值能夠被保存到視圖狀態(tài)對象中,但頁面控件的改變并不能保存到其中。可以通過重載SaveViewState實現(xiàn)這個步驟。
9.呈現(xiàn)HTML
Render事件通過裝配用于瀏覽器輸出的HTML來著手頁的創(chuàng)建。在Render事件中,頁調用對象使它們呈現(xiàn)為HTML,然后頁收集HTML來發(fā)送。當Render事件被重載的時候,開發(fā)者可以為瀏覽器創(chuàng)建定制的HTML,此時頁面創(chuàng)建的任何HTML都還沒有生效。Render 方法用HtmlTextWriter對象作參數(shù)并由它產生HTML給瀏覽器。這里仍然可以作修改,但是這樣的修改只會反映到客戶(譯者注:意即改變只會在HTML呈現(xiàn)中反映而視圖狀態(tài)并無法被改變)。Render 事件可以被重載
10.釋放
當頁面的HTML呈現(xiàn)后,對象被釋放。在Dispose事件中,你可以清除任何在頁面創(chuàng)建中構造的對象或者引用。在這里,所有的處理都已經被執(zhí)行,你可以安全的釋放任何還存在的對象,包括Page對象。
Dispose能被重載具體對應的事件順序如下:
Page_Init()
LoadViewState
LoadPostData
Page_Load()
RaisePostDataChanged
RaisePostBackEvent
Page_PreRender()
SaveViewState
Page_Render()
UnLoad