asp.net頁面生命週期之頁面的終結階段

處理過回發事件之後,頁面便爲瀏覽器生成輸出做好了準備。呈現階段分爲兩部分:預呈現和標記生成。預呈現這個子階段有兩個事件表徵,分別爲:預處理和投遞處理。

PreRender事件

通過處理該事件,頁面和控件可以進行生成輸出前的任何更改。頁面會首先引發自己的PreRender事件,然後按遞歸方式引發所有的子控件。注意,這時的頁面已確保其所有子控件都被創建。對於組合控件來說,該階段尤爲重要。

PreRenderComplete事件

由於所有子控件的PreRender事件會以遞歸方式逐一被調用,因而頁面設計者無法知道預呈現階段是否已經完成。爲此,asp.net2.0版本引入了一個只針對頁面的新事件,即PreRenderComplete事件。

SaveStateComplete事件

在每個控件被呈現輸出,爲頁面生成標記前的一段時間裏,要將當前頁面的狀態存儲在視圖狀態介質中。值得一提的是,在該點之後對狀態做的任何更改可能會被呈現,但不會被存儲,且在下一次回發時無法獲得恢復。頁面狀態存儲是一個遞歸的過程,頁面處理程序會遍歷整個頁面樹,逐一調用每個控件的SaveViewState方法,包括頁面自身的。

SaveViewState是受保護的虛擬方法(可以重寫),負責存儲當期控件的ViewState字典內容。

還有另一種狀態類型,即所謂的“控件狀態”,控件狀態是一種私有的狀態,不受應用程序控件支配。換句話說,控件的控件狀態不能夠像視圖狀態一樣,以編程方式被禁用。控件狀態在此時也會被存儲。他是另一種狀態狀態存儲機制,與視圖狀態類似,其數據也可以用於維護頁間回發,但控件狀態的目的是,維護控件的必要信息,以便使其正常工作。也就是說,具有狀態行爲的屬性數據應保存在控件狀態中,而用戶界面屬性數據(如控件的內容)應保存在視圖狀態中。

標記的生成

針對瀏覽器的標記生成,會分別由每個子控件自己完成,生成的標記會被存儲到一個緩衝中。有幾個重寫方法會幫助開發者分別標記生成的階段進行控制--開始標籤、主體和結束標籤。沒有與該階段相關聯的用戶事件。

Unload事件

呈現階段之後會進行一次遞歸調用,引發每個控件的Unload事件,最後是頁面自身的。Unload事件用於在頁面對象被釋放前,執行最終的清理工作。一般的操作作爲文件和數據庫鏈接的關閉。

注意,卸載通知會在頁面或控件正要被卸載且尚未被釋放前到大。對於實際的頁面,重寫Page類的Dispose方法,或只處理頁面的Disposed事件,是在它從內存中被釋放前做清理工作的最後機會 。頁面處理程序會調用Dispose方法,釋放頁面對象。在對Unload事件處理程序的遞歸調用完畢之後,會被立即引發。

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