Web Control開發隨筆(2):ASP.NET 控件生命週期

在生命週期中將執行一系列處理步驟,這些步驟包括:

實例化 (Instantiate)

控件被頁面或另一個控件通過調用它的構造器所實例化。這個步驟之後所列出的階段,僅當控件加入控件樹中才會發生。

初始化 (Initialize)

初始化在傳入 Web 請求生命週期內所需的設置。在此階段,控件樹中的頁面和全部控件通過默認方式來調用 OnInit方法。開發人員可以通過重載 OnInit方法,爲控件提供 初始化邏輯。在其生命週期的這個時候,控件能夠安全地訪問其置於 Controls集合中的子控件,但是它不能訪問控件層次中的父控件或其他層次更高的控件 (如頁面)

開始跟蹤視圖狀態 (Begin Tracking View State)

這個階段發生在初始化階段的末尾。在此階段頁面自動調用 TrackViewState方法。 TrackViewState方法保證在此階段之後, 使用 ViewState字典屬性而產生的變化保存在控件視圖狀態中。在大多數情況下, Control基類提供的 TrackViewState方法實現已經 足夠了,只有在控件定義了複雜屬性時,才必須重載 TrackViewState方法。


加載視圖狀態(僅用於回傳過程) (Load View State (postback only))

這個階段發生在回傳時,而不是初始請求過程中,在此階段結束時,就會自動填充控件的 ViewState 屬性控件可以重寫 LoadViewState 方法的默認實現,以自定義狀態還原。


加載回傳數據(僅用於回傳過程,爲可選項) (Load Postback Data(postback only, optional))

只有在控件通過實現 IPostBackDataHandler接口參與了回傳數據處理時,這個階段才發生在回傳中。 TextBox控件就是一個例 子。在這個階段中,控件必須從已發送的表單數據中,通過實現 IPostBackDataHandler藉口的 LoadPostData方法更新其狀態。


加載 (Load)

直到此階段開始,控件樹中的所有控件都已被初始化,並恢復到它們在先前週期最後的狀態。 OnLoad方法會執行所有請求共有的操作,如設置數據庫 查詢。此時,樹中的服務器控件已創建並初始化、狀態已還原並且窗體控件反映了客戶端的數據。如果需要實現僅在頁面初始請求中執行的邏輯,那麼實現該邏輯 時,應該檢查頁面的 IsPostBack屬性


引發修改事件(僅用於回傳過程,爲可選項) (Raise Changed Events(postback only, optional))

只有在控件通過實現 IPostBackDataHandler接口參與了回傳數據處理時,這個階段才發生在回傳中。在此階段中,控件通過引發事件 (如 TextBox TextChanged事件)作爲一種信號 -----其狀態由於回傳而改變(引發更改事件以響應當前和以前回發之間的狀態更改)。爲 了參與此階段,控件必須實現 IPostBackDataHandler接口的 RaisePostDataChangedEvent方法。


引發回傳事件(僅用於回傳過程,爲可選項) (Raise Postback Events(postback only, optional))

只有在控件通過實現 IPostBackEventHandler接口參與了回傳數據處理時,這個階段才發生在回傳中。在此階段可以通過實現 IPostBackEventHandler接口的 RaisePostBackEvent方法來實現邏輯,以便把客戶端事件映射到服務器端事件。


預生成 (PreRender)

在此階段中,應該通過重載 OnPreRender方法,執行在生成控件之前所需要的任何工作。在生成輸出之前執行任何更新,可以保存在預生成階段對控件狀態所做的更改,而在生成階段所對應的更改則會丟失。


保存視圖狀態 (Save View State)

如果控件不維持狀態,或者它爲保存其所有狀態信息而使用 ViewState字典,那麼不必在此階段期間實現任何附加邏輯。在此階段期間,頁面框架 會自動保存 ViewState字典。如果需要自定義狀態管理,必須通過重載 SaveViewState方法來實現自定義狀態恢復,這種方法只被 EnableViewState屬性爲 true的控件所調用。在此階段以後任何控件的改變都不會保存在控件的視圖狀態中。


生成 (Render)

通過這種方法,控件在輸出流上通過重載 Control Render方法或 WebControl類的 rendering方法中的一種,來寫標記文本。


卸載 (Unload)

在此階段中,頁面通過實現 Page_Unload方法,來執行清除工作。作爲控件開發者,應該重載 Dispose方法來執行清除。


釋放 (Dispose)

在此階段,應該重載 Dispose方法來釋放控件所佔的全部資源。

 

各階段對應的事件方法如圖:


 

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