1. 程式人生 > >ASP.NET 頁面執行順序

ASP.NET 頁面執行順序

引用 初始化 基於 服務器端 之一 視圖 框架 訪問 一致性

1.對象初始化(Onlnit方法)

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

2.加載視圖狀態數據(loadViewState事件)

初始化以後,控件僅能通過ID引用(還沒有建立用於相對引用的文檔對象模型)。在LoadViewState事件中,已初始化的控件獲得第一個屬性,上次提交存留到服務器的視圖狀態信息。頁視圖狀態通過ASP.NET維護,它被用於在一個往返行程中存留信息到服務器.視圖狀態信息被保存未一個名稱值對,它包含控件的如text和value一類的信息.視圖信息被保存在隱藏<input>控件的值屬性中在頁請求中傳遞

3.處理回傳數據(LoadPostData事件)

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

4 對象加載(OnLoad方法)

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

5.激發RaisePostDataChanged 事件

如前所述,這發生在所有實現了IPostBackDataHandler接口的控件被正確的回傳數據更新以後。在這個過程中,每個控件都有一個布爾值的標識,標識其自上一次提交後該控件的數據是被更改還是保持原值。然後ASP.NET通過搜索頁來尋找任何顯示控件數據被更改的標識並激發RaisePostDataChanged。RaisePostDataChanged事件直到Load事件發生後,所有控件被更新後才激發。這保證了在控件被回傳數據更新前,其它控件的數據在RaisePostDataChanged事件中沒有被手動更改過。

6.處理客戶端回傳事件(RaisePostBackEvent事件)

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

7.對象預呈現(OnPreRender事件)

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

8.保存視圖狀態(SaveViewState事件)

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

9.呈現HTML(Render事件)

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

10.釋放(Dispose事件)

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

具體對應的事件順序如下:

①Page_Init() 對象初始化;

②LoadViewState 加載視圖狀態;

③LoadPostData 處理回送數據;

④Page_Load() 頁面加載;

⑤RaisePostDataChanged 數據更新並回送事件;

⑥RaisePostBackEvent 處理客戶端回傳的事件;

⑦Page_PreRender()頁面預處理;

⑧SaveViewState 保存視圖狀態;

⑨Page_Render() 呈現Html靜態頁面;

⑩UnLoad 釋放頁面;

ASP.NET 頁面執行順序