服務器控件
控件執行生命周期
每次請求 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。