ASP.NET 伺服器控制元件的生命週期
-
初始化 -
Init
事件 (OnInit
方法) -
載入檢視狀態 -
LoadViewState
方法 -
處理回發資料 -
LoadPostData
方法
對實現IPostBackDataHandler
介面的控制元件,即可以自動載入回發資料的控制元件,如TextBox
,DropDownList
等。 -
載入 -
Load
事件 (OnLoad
方法) -
傳送回發更改通知 -
RaisePostDataChangedEvent
方法對實現IPostBackDataHandler
介面的控制元件,即可以自動載入回發資料的控制元件。ASP.NET
頁框架跟蹤所有對LoadPostData
方法呼叫返回true
的伺服器控制元件,然後對這些控制元件呼叫RaisePostDataChangedEvent
方法。在第 3 步中載入回發資料,如果回發前後資料發生更改,則在這一步觸發相應的服務端事件。 -
處理回發事件 -
RaisePostBackEvent
方法對實現IPostBackEventHandler
介面的控制元件,即能引起回發的控制元件,如Button
,LinkButton
,Calendar
等 -
預呈現 -
PreRender
事件 (OnPreRender
方法) -
儲存檢視狀態 -
SaveViewState
方法 -
呈現 -
Render
方法 -
處置 -
Dispose
方法 -
解除安裝 -
UnLoad
事件 (OnUnLoad
方法)
Web Form
的基類 System.Web.UI.Page
從 System.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
事件。
相關文章
- ASP.NET頁面生命週期與應用程式生命週期ASP.NET
- asp.net core服務的生命週期ASP.NET
- 2、ASP.NET Core中服務的生命週期ASP.NET
- View生命週期與Activity生命週期的關係View
- 生命週期
- viewController的生命週期ViewController
- Servlet的生命週期Servlet
- UIViewController的生命週期UIViewController
- Flutter 的生命週期Flutter
- Spring的生命週期Spring
- bean的生命週期Bean
- SQL的生命週期SQL
- Laravel的生命週期Laravel
- 類的生命週期
- 品牌生命週期和產品生命週期之間的關係
- vue - 生命週期Vue
- Fragment生命週期Fragment
- vue生命週期Vue
- spring生命週期Spring
- ubuntu生命週期Ubuntu
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- PHP 生命週期PHP
- maven生命週期Maven
- Activity生命週期
- React生命週期React
- React新的生命週期React
- iOS APP的生命週期iOSAPP
- Vue生命週期的理解Vue
- Java 物件的生命週期Java物件
- Avalonia的Window生命週期
- Flutter widget的生命週期Flutter
- Spring Bean的生命週期SpringBean
- Spring的生命週期主Spring
- Spring Bean 的生命週期SpringBean
- Salesforce 生命週期管理(一)應用生命週期淺談Salesforce
- Vue的生命週期的理解Vue
- vue 生命週期梳理Vue