控制項生存周期
當一個asp.net頁面被請求後,一個page執行個體被產生,開始自己的邏輯,最終返回HTML流給使用者端。構成邏輯處理的是page中存在的伺服器端控制項以及控制項間的互動,並且在頁面結束前伺服器控制項們被銷毀(視.net的回收策略而定)。那麼這些控制項在短短的頁面處理過程中經曆了建立、處理、銷毀等到底是如何組織的?這些控制項是如何同其他控制項互動,如何在多個頁面間保持狀態的?(這應當是整個控制項開發的基本也是重要的知識)
首先,我們看看特殊的控制項,也就是Page類,所有aspx頁面的父類(或者祖先)。因為這是我們程式員主要的舞台。Page類繼承自TemplateControl, 且實現了IhttpHandler。IhttpHandler介面是保證頁面被asp.net架構所調度,並且可以獲得HTTP協議的資料輸入流以及獲得向HTTP輸出資料流輸出資料的能力;而TemplateControl類是繼承自Control類。Page實現了InamingContainer介面,這保證了他可以充當頁面中的控制項們的容器(控制項們的戰鬥舞台)
好了,現在看看控制項的生命週期(看看MS是如何定義這個架構體系的):
1、 Instance 執行個體化
通過控制項的構造器所執行個體化。還可以通過被父控制項執行個體化而產生。
2、 Initialize 初始化
控制項會通過預設調用OnInit方法,從而引發On_init事件。Page根據aspx頁面的文法以及標籤設定值來初始化控制項,對聲明文法中的控制項及其屬性賦值。作為一個特殊控制項,一般可以在Page的OnInit事件中允許編程者提供控間的初始化操作(對某些屬性賦值)。對於控制項包含的子控制項,控制項可以訪問他們,但是子控制項是不可以訪問父控制項的(因為控制項此時還沒有被載入(Load))。
3、 Begin Tracking View State 開始跟蹤檢視狀態
發生在初始化階段末尾,Page會調用控制項的TrackViewState方法(這是一個繼承自Control的保護方法)
4、 Load View State 載入視圖
此時,頁面架構自動回復了ViewState字典(ViewState資料來自表單form中的隱含欄位),控制項會根據ViewState值來設定自己的屬性或者內部欄位變數等
5、 Load PostBack Data載入回傳資料
如果控制項實現了IpostBackDataHandle介面,那麼頁面回調用控制項實現的介面,讓其參與對回傳資料的處理
6、 Load 載入
此時,控制項樹(page的控制項以及控制項的子控制項構成的樹)所有控制項都已經被初始化,並恢複到上一個周期的狀態(這是通過ViewState獲得的),可以訪問其他的任何控制項。
7、 Raise Change Events引發修改(控制項的)事件
處理回傳的資料,此時可能會引起控制項的某些事件作為對某些屬性被修改的通知。
8、 Raise Postback Event 引發回傳資料
當發生修改事件時候,引發將用戶端發生的一些事件映射到伺服器控制項的事件,從而調用控制項的事件的處理常式。這大多是控制項開發人員的客戶—另外一些程式員重用控制項時的舞台。
9、 PreRender 預產生
通過調用控制項的OnPreRender方法,執行在產生控制項前的所需任何工作。遞迴調用子控制項的此方法。
10、Save View State 儲存檢視狀態
控制項繼承Control的方法來儲存當前控制項狀態到ViewState中去
11、Render 產生
控制項輸出HTML資料到HTML流中去。
12、Unload 卸載
頁面通過實現Page_Onload方法執行清除工作,也預設引發控制項的Unload事件
13、Dispose釋放
此時,控制項執行清除佔用資源的方法。
以上討論適宜於在aspx頁面中聲明建立的控制項,如果是在頁面/控制項的事件處理常式中創造得控制項,則在控制項加入到控制項樹開始執行各個階段,直到達到頁面的當前階段,之後,該動態建立的控制項將隨同頁面其他控制項一樣工作。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=265217