服務(wù)器控件
控件執(zhí)行生命周期
每次請(qǐng)求 ASP.NET 頁(yè)時(shí),服務(wù)器就會(huì)加載一個(gè) ASP.NET 頁(yè),并在請(qǐng)求完成時(shí)卸載該頁(yè)。頁(yè)及其包含的服務(wù)器控件負(fù)責(zé)執(zhí)行請(qǐng)求并將 HTML 呈現(xiàn)給客戶端。雖然客戶端和服務(wù)器之間的通信是無狀態(tài)的和斷續(xù)的,但是必須使客戶感覺到這是一個(gè)連續(xù)執(zhí)行的過程。
這種連續(xù)性假象是由 ASP.NET 頁(yè)框架、頁(yè)及其控件實(shí)現(xiàn)的。回發(fā)后,控件的行為必須看起來是從上次 Web 請(qǐng)求結(jié)束的地方開始的。雖然 ASP.NET 頁(yè)框架可使執(zhí)行狀態(tài)管理相對(duì)容易一些,但是為了獲得連續(xù)性效果,控件開發(fā)人員必須知道控件的執(zhí)行順序。控件開發(fā)人員需要了解:在控件生命周期的各個(gè)階段,控件可使用哪些信息、保持哪些數(shù)據(jù)、控件呈現(xiàn)時(shí)處于哪種狀態(tài)。例如,在填充頁(yè)上的控件樹之前控件不能調(diào)用其父級(jí)。
下表提供了控件生命周期中各階段的高級(jí)概述。有關(guān)詳細(xì)信息,請(qǐng)點(diǎn)擊表中的鏈接。
階段 |
控件需要執(zhí)行的操作 |
要重寫的方法或事件 |
初始化 |
初始化在傳入 Web 請(qǐng)求生命周期內(nèi)所需的設(shè)置。請(qǐng)參見處理繼承的事件。 |
Init 事件(OnInit 方法) |
加載視圖狀態(tài) |
在此階段結(jié)束時(shí),就會(huì)自動(dòng)填充控件的 ViewState 屬性,詳見維護(hù)控件中的狀態(tài)中的介紹。控件可以重寫 LoadViewState 方法的默認(rèn)實(shí)現(xiàn),以自定義狀態(tài)還原。 |
LoadViewState 方法 |
處理回發(fā)數(shù)據(jù) |
處理傳入窗體數(shù)據(jù),并相應(yīng)地更新屬性。請(qǐng)參見處理回發(fā)數(shù)據(jù)。 注意 只有處理回發(fā)數(shù)據(jù)的控件參與此階段。 |
LoadPostData 方法 (如果已實(shí)現(xiàn) IPostBackDataHandler) |
加載 |
執(zhí)行所有請(qǐng)求共有的操作,如設(shè)置數(shù)據(jù)庫(kù)查詢。此時(shí),樹中的服務(wù)器控件已創(chuàng)建并初始化、狀態(tài)已還原并且窗體控件反映了客戶端的數(shù)據(jù)。請(qǐng)參見處理繼承的事件。 |
Load 事件 (OnLoad 方法) |
發(fā)送回發(fā)更改通知 |
引發(fā)更改事件以響應(yīng)當(dāng)前和以前回發(fā)之間的狀態(tài)更改。請(qǐng)參見處理回發(fā)數(shù)據(jù)。 注意 只有引發(fā)回發(fā)更改事件的控件參與此階段。 |
RaisePostDataChangedEvent 方法 (如果已實(shí)現(xiàn) IPostBackDataHandler) |
處理回發(fā)事件 |
處理引起回發(fā)的客戶端事件,并在服務(wù)器上引發(fā)相應(yīng)的事件。請(qǐng)參見捕獲回發(fā)事件。 注意 只有處理回發(fā)事件的控件參與此階段。 |
RaisePostBackEvent 方法 (如果已實(shí)現(xiàn) IPostBackEventHandler) |
預(yù)呈現(xiàn) |
在呈現(xiàn)輸出之前執(zhí)行任何更新。可以保存在預(yù)呈現(xiàn)階段對(duì)控件狀態(tài)所做的更改,而在呈現(xiàn)階段所對(duì)的更改則會(huì)丟失。請(qǐng)參見處理繼承的事件。 |
PreRender 事件 (OnPreRender 方法) |
保存狀態(tài) |
在此階段后,自動(dòng)將控件的 ViewState 屬性保持到字符串對(duì)象中。此字符串對(duì)象被發(fā)送到客戶端并作為隱藏變量發(fā)送回來。為了提高效率,控件可以重寫 SaveViewState 方法以修改 ViewState 屬性。請(qǐng)參見維護(hù)控件中的狀態(tài)。 |
SaveViewState 方法 |
呈現(xiàn) |
生成呈現(xiàn)給客戶端的輸出。請(qǐng)參見呈現(xiàn) ASP.NET 服務(wù)器控件。 |
Render 方法 |
處置 |
執(zhí)行銷毀控件前的所有最終清理操作。在此階段必須釋放對(duì)昂貴資源的引用,如數(shù)據(jù)庫(kù)鏈接。請(qǐng)參見 ASP.NET 服務(wù)器控件中的方法。 |
Dispose 方法 |
卸載 |
執(zhí)行銷毀控件前的所有最終清理操作。控件作者通常在 Dispose 中執(zhí)行清除,而不處理此事件。 |
UnLoad 事件(On UnLoad 方法) |
注意 要重寫 EventName 事件,請(qǐng)重寫 OnEventName 方法(并調(diào)用 base.OnEventName)。
第三列中的方法和事件是從 System.Web.UI.Control 繼承的,但以下幾個(gè)除外:LoadPostData 和 RaisePostDataChangedEvent 是 IPostBackDataHandler 接口的方法,而 RaisePostBackEvent 屬于 IPostBackEventHandler 接口。如果控件參與回發(fā)數(shù)據(jù)處理,則必須實(shí)現(xiàn) IPostBackDataHandler。如果控件收到回發(fā)事件,則必須實(shí)現(xiàn) IPostBackEventHandler。
表中沒有列出 CreateChildControls 方法,這是由于每當(dāng) ASP.NET 頁(yè)框架需要?jiǎng)?chuàng)建控件樹時(shí)就會(huì)調(diào)用該方法,且該方法調(diào)用并不限于控件生命周期的特定階段。例如,可以在加載頁(yè)時(shí)、在綁定數(shù)據(jù)過程中或者在呈現(xiàn)過程中調(diào)用 CreateChildControls。