ASP.NET 伺服器控制元件的生命週期

風靈使發表於2019-04-07
  1. 初始化 - Init事件 (OnInit 方法)

  2. 載入檢視狀態 - LoadViewState方法

  3. 處理回發資料 - LoadPostData方法
    對實現 IPostBackDataHandler 介面的控制元件,即可以自動載入回發資料的控制元件,如 TextBox, DropDownList 等。

  4. 載入 - Load 事件 (OnLoad 方法)

  5. 傳送回發更改通知 - RaisePostDataChangedEvent方法對實現IPostBackDataHandler 介面的控制元件,即可以自動載入回發資料的控制元件。ASP.NET 頁框架跟蹤所有對LoadPostData方法呼叫返回 true 的伺服器控制元件,然後對這些控制元件呼叫 RaisePostDataChangedEvent 方法。在第 3 步中載入回發資料,如果回發前後資料發生更改,則在這一步觸發相應的服務端事件。

  6. 處理回發事件 - RaisePostBackEvent方法對實現 IPostBackEventHandler 介面的控制元件,即能引起回發的控制元件,如 Button, LinkButton, Calendar

  7. 預呈現 - PreRender事件 (OnPreRender 方法)

  8. 儲存檢視狀態 - SaveViewState方法

  9. 呈現 - Render方法

  10. 處置 - Dispose方法

  11. 解除安裝 - UnLoad事件 (OnUnLoad 方法)

Web Form 的基類 System.Web.UI.PageSystem.Web.UI.Control 繼承,它也是一種特殊的 Control


ASP.NET中伺服器控制元件的生命週期

伺服器控制元件的生命週期是建立伺服器控制元件最重要的概念。作為開發人員,必須對伺服器控制元件生命週期深刻理解。當然,這不是一朝一夕就可以做到的。對於學習控制元件開發技術的初學者,可以不必掌握得非常詳細深入,只需對伺服器控制元件的生命週期中的不同階段有一個大致的瞭解即可。

初始化(oninit)

載入檢視狀態

處理回發資料(回發是瀏覽器又一次請求伺服器)

載入

傳送回發更改通知

處理回發事件

預呈現

儲存狀態

呈現

處置(釋放資源)

解除安裝(unload)

當Web伺服器接收到一個HTTP請求(request),會返回一個HTTP響應(response),例如送回一個HTML頁面。

在掌握伺服器控制元件生命週期的過程中,讀者要特別注意有關伺服器控制元件狀態的相關內容。在重點了解生命週期各個階段的同時,對伺服器控制元件的狀態變化要注意以下問題:

控制元件的生命週期何時儲存控制元件和恢復其狀態;何時與頁面及其他控制元件之間進行互動;何時執行重要的處理邏輯;在各個階段,控制元件可使用哪些資訊、保持哪些資料、控制元件呈現時處於哪種狀態以及何時輸出顯示標記文字等。

如下列舉了伺服器控制元件生命週期所要經歷的11個階段。

(1)初始化:

在此階段中,主要完成兩項工作:
一、初始化在傳入Web請求生命週期內所需的設定;
二、跟蹤檢視狀態。首先,頁面框架通過預設方式引發Init事件,並呼叫OnInit()方法,控制元件開發人員可以重寫該方法為控制元件提供初始化邏輯。此後,頁面框架將呼叫TrackViewState方法來跟蹤檢視狀態。需要注意的是:多數情況下,Control基類提供的TrackViewState方法實現已經足夠了。只有在控制元件定義了複雜屬性時,開發人員才可能需要重寫TrackViewState方法。

(2)載入檢視狀態:

此階段的主要任務是檢查ASP.NET伺服器控制元件是否存在以及是否需要將其狀態恢復到它在處理之前的請求結束的狀態。

因此該過程發生在頁面回傳過程中,而不是初始化請求過程。在此階段,頁面框架將自動恢復ViewState字典。如果伺服器控制元件不維持其狀態,或者它有能力通過預設方式儲存其所有狀態而使用ViewState字典,那麼開發人員則不必實現任何邏輯。針對那些無法在ViewState字典中儲存的資料型別或者需要自定義狀態管理的情況,開發人員可以通過重寫LoadViewState方法來自定義狀態的恢復和管理。

(3)處理回發資料:

若要使控制元件能夠檢查客戶端發回的窗體資料,那麼必須實現System.Web.UI.IPostBackDataHandler介面的LoadPostData()方法。因此只有處理回發資料的控制元件參與此階段。

(4)載入:

至此階段開始,控制元件樹中的ASP.NET伺服器控制元件已建立並初始化、狀態已還原並且窗體控制元件反映了客戶端的資料。此時,開發人員可以通過重寫OnLoad()方法來實現每個請求共同的邏輯。

(5)傳送回發更改通知:

在此階段,ASP.NET伺服器控制元件通過引發事件作為一種訊號,表明由於回發而發生的控制元件狀態變化(因此該階段僅用於回發過程)。為了建立這種訊號,開發人員必須再次使用System.Web.UI.IPostBackDataHandler介面,並實現另一方法-RaisePostBackChangedEvent()。其判斷過程為:如果控制元件狀態因回發而更改,則LoadPostData()返回true;否則返回false。頁面框架跟蹤所有返回true的控制元件並在這些控制元件上呼叫RaisePostDataChangedEvent()

(6)處理回發事件:

該階段處理引起回發的客戶端事件。為了便於將客戶端事件對映到伺服器端事件上進行處理,開發人員在此階段可以通過實現System.Web.UI.IPostBackEventHandler介面的RaisePostBackEvent()方法來實現該邏輯。由此途徑,伺服器控制元件將成功捕獲回發的客戶端事件進行伺服器端的相應處理。

(7)預呈現:

該階段完成在生成控制元件之前所需要的任何工作。通常情況下是通過重寫OnPreRender()方法完成該工作。需要注意的是:在該階段,可以儲存在預呈現階段對控制元件狀態所做的更改,而在呈現階段進行的更改則會丟失。

(8)儲存狀態:

如果ASP.NET伺服器控制元件不維持狀態,或者它有能力通過預設方式儲存其所有狀態而使用ViewState字典,那麼開發人員不必在該階段實現任何邏輯。因為這個儲存狀態的過程是自動的。如果ASP.NET伺服器控制元件需要自定義狀態儲存,或者控制元件無法在ViewState字典中儲存特殊的資料型別,則需要通過重寫SaveViewState()方法來實現狀態儲存。

(9)呈現:

表示向HTTP輸出流中寫入標記文字的過程。開發人員通過重寫Render()方法使其在輸出流上自定義標記文字。

(10)處置:

在此階段中,通過重寫Dispose ()方法完成釋放對昂貴資源的引用,如資料庫連結等。

(11)解除安裝:

完成的工作與"處置"階段相同,但是,開發人員通常在Dispose()方法中執行清除,而不處理Unload事件。

相關文章