服務器控件

控件執行生命周期

每次請求 ASP.NET 頁時,服務器就會加載一個 ASP.NET 頁,并在請求完成時卸載該頁。頁及其包含的服務器控件負責執行請求并將 HTML 呈現給客戶端。雖然客戶端和服務器之間的通信是無狀態的和斷續的,但是必須使客戶感覺到這是一個連續執行的過程。

這種連續性假象是由 ASP.NET 頁框架、頁及其控件實現的。回發后,控件的行為必須看起來是從上次 Web 請求結束的地方開始的。雖然 ASP.NET 頁框架可使執行狀態管理相對容易一些,但是為了獲得連續性效果,控件開發人員必須知道控件的執行順序。控件開發人員需要了解:在控件生命周期的各個階段,控件可使用哪些信息、保持哪些數據、控件呈現時處于哪種狀態。例如,在填充頁上的控件樹之前控件不能調用其父級。

下表提供了控件生命周期中各階段的高級概述。有關詳細信息,請點擊表中的鏈接。

階段

控件需要執行的操作

要重寫的方法或事件

初始化

初始化在傳入 Web 請求生命周期內所需的設置。請參見處理繼承的事件

Init 事件(OnInit 方法)

加載視圖狀態

在此階段結束時,就會自動填充控件的 ViewState 屬性,詳見維護控件中的狀態中的介紹。控件可以重寫 LoadViewState 方法的默認實現,以自定義狀態還原。

LoadViewState 方法

處理回發數據

處理傳入窗體數據,并相應地更新屬性。請參見處理回發數據

注意   只有處理回發數據的控件參與此階段。

LoadPostData 方法

(如果已實現 IPostBackDataHandler

加載

執行所有請求共有的操作,如設置數據庫查詢。此時,樹中的服務器控件已創建并初始化、狀態已還原并且窗體控件反映了客戶端的數據。請參見處理繼承的事件

Load 事件

OnLoad 方法)

發送回發更改通知

引發更改事件以響應當前和以前回發之間的狀態更改。請參見處理回發數據

注意   只有引發回發更改事件的控件參與此階段。

RaisePostDataChangedEvent 方法

(如果已實現 IPostBackDataHandler

處理回發事件

處理引起回發的客戶端事件,并在服務器上引發相應的事件。請參見捕獲回發事件

注意   只有處理回發事件的控件參與此階段。

RaisePostBackEvent 方法

(如果已實現 IPostBackEventHandler

預呈現

在呈現輸出之前執行任何更新。可以保存在預呈現階段對控件狀態所做的更改,而在呈現階段所對的更改則會丟失。請參見處理繼承的事件

PreRender 事件

OnPreRender 方法)

保存狀態

在此階段后,自動將控件的 ViewState 屬性保持到字符串對象中。此字符串對象被發送到客戶端并作為隱藏變量發送回來。為了提高效率,控件可以重寫 SaveViewState 方法以修改 ViewState 屬性。請參見維護控件中的狀態

SaveViewState 方法

呈現

生成呈現給客戶端的輸出。請參見呈現 ASP.NET 服務器控件

Render 方法

處置

執行銷毀控件前的所有最終清理操作。在此階段必須釋放對昂貴資源的引用,如數據庫鏈接。請參見 ASP.NET 服務器控件中的方法

Dispose 方法

卸載

執行銷毀控件前的所有最終清理操作。控件作者通常在 Dispose 中執行清除,而不處理此事件。

UnLoad 事件(On UnLoad 方法)

注意   要重寫 EventName 事件,請重寫 OnEventName 方法(并調用 base.OnEventName)。

第三列中的方法和事件是從 System.Web.UI.Control 繼承的,但以下幾個除外:LoadPostData RaisePostDataChangedEvent IPostBackDataHandler 接口的方法,而 RaisePostBackEvent 屬于 IPostBackEventHandler 接口。如果控件參與回發數據處理,則必須實現 IPostBackDataHandler。如果控件收到回發事件,則必須實現 IPostBackEventHandler

表中沒有列出 CreateChildControls 方法,這是由于每當 ASP.NET 頁框架需要創建控件樹時就會調用該方法,且該方法調用并不限于控件生命周期的特定階段。例如,可以在加載頁時、在綁定數據過程中或者在呈現過程中調用 CreateChildControls