1. 程式人生 > >c# 關於頁面生命周期

c# 關於頁面生命周期

val 其他 orm 概述 版本 source NPU quest 出了

每次遇到這個問題,總是含含糊糊的說不清楚,今天就在這裏統一整理一下,以便以後的查看。

一般來說,頁要經歷下表概述的各個階段。除了頁生命周期階段以外,在請求前後還存在應用程序階段,但是這些階段並不特定於頁

階段

說明

頁請求

頁請求發生在頁生命周期開始之前。用戶請求頁時,ASP.NET 將確定是否需要分析和編譯頁(從而開始頁的生命周期),或者是否可以在不運行頁的情況下發送頁的緩存版本以進行響應。

開始

在開始階段,將設置頁屬性,如 Request 和 Response。在此階段,頁還將確定請求是回發請求還是新請求,並設置 IsPostBack 屬性。此外,在開始階段期間,還將設置頁的 UICulture 屬性。

頁初始化

頁初始化期間,可以使用頁中的控件,並將設置每個控件的 UniqueID 屬性。此外,任何主題都將應用於頁。如果當前請求是回發請求,則回發數據尚未加載,並且控件屬性值尚未還原為視圖狀態中的值。

加載

加載期間,如果當前請求是回發請求,則將使用從視圖狀態和控件狀態恢復的信息加載控件屬性。

驗證

在驗證期間,將調用所有驗證程序控件的 Validate 方法,此方法將設置各個驗證程序控件和頁的 IsValid 屬性。

回發事件處理

如果請求是回發請求,則將調用所有事件處理程序。

呈現

在呈現之前,會針對該頁和所有控件保存視圖狀態。在呈現階段中,頁會針對每個控件調用 Render 方法,它會提供一個文本編寫器,用於將控件的輸出寫入頁的 Response 屬性的 OutputStream 中。

卸載

完全呈現頁並已將頁發送至客戶端、準備丟棄該頁後,將調用卸載。此時,將卸載頁屬性(如 Response 和 Request)並執行清理。

生命周期事件

下面簡單介紹一下頁面的生命周期(只列出了最常用的事件,當然還包括其他的事件)

頁事件

典型使用

PreInit

使用該事件來執行下列操作:

· 檢查 IsPostBack 屬性來確定是不是第一次處理該頁。

· 創建或重新創建動態控件。

· 動態設置主控頁。

· 動態設置 Theme 屬性。

· 讀取或設置配置文件屬性值。

Init

在所有控件都已初始化且已應用所有外觀設置後引發。使用該事件來讀取或初始化控件屬性。

InitComplete

由 Page 對象引發。使用該事件來處理要求先完成所有初始化工作的任務。

LoadViewState

在LoadViewState事件中,已初始化的控件獲得第一個屬性,即上一次提交存留到服務器的視圖狀態信息。頁視圖狀態通過ASP.NET維護,通常被用於在一個往返行程中存留信息到服務器。視圖狀態信息以一個名稱/值對的形式進行保存,它包含控件的Text和Value這一類信息。視圖信息在頁請求中進行傳遞,通常保存在隱藏<input>控件的值屬性中。這個事件可以通過LoadViewState方法重載,往往用來在控件被填充時定制它所接受的數據。

LoadPostData

在創建頁的階段,被發送到服務器端的Form數據(也稱為回傳數據)依照每個控件的數據需求進行處理。當頁面提交Form時,框架將在每個提交數據的控件上實現IPostBackDataHandler接口。隨後,頁面激發LoadPostData事件,通過頁面解析發現實現了IPostBackDataHandler 接口的控件,並用正確的回傳數據更新控件狀態。ASP.NET更新正確的控件是通過匹配控件的唯一標示符來實現的,該標示符具有名稱值集合中的名稱值對。

PreLoad

如果需要在 Load 事件之前對頁或控件執行處理,請使用該事件。

在 Page 引發該事件後,它會為自身和所有控件加載視圖狀態,然後會處理 Request 實例包括的任何回發數據。

Load

Page 在 Page 上調用 OnLoad 事件方法,然後以遞歸方式對每個子控件執行相同操作,如此循環往復,直到加載完本頁和所有控件為止。

使用 OnLoad 事件方法來設置控件中的屬性並建立數據庫連接。

控件事件

使用這些事件來處理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。

LoadComplete

對需要加載頁上的所有其他控件的任務使用該事件。

RaisePostDataChanged 這發生在所有實現了IPostBackDataHandler接口的控件被正確的回傳數據更新以後。在這個過程中,每個控件都有一個布爾值的標識,標識其自上一次提交後該控件的數據是否被更改。然後ASP.NET通過搜索頁來尋找任何顯示控件數據被更改的標識,並激發 RaisePostDataChanged事件。

註意:這個事件直到Load事件發生後,所有控件被更新後才激發。這個機制可以保證在控件被回傳數據更新前,其他控件的數據在RaisePostDataChanged事件中沒有被手動更改過。

RaisePostBackEvent(處理客戶端回傳事件)

當回傳更新導致數據改變而引發服務器端事件後,引發回傳的對象會在RaisePostBackEvent事件中被處理。這種激發回傳的對象往往是其狀態改變而引發回傳的控件(其autopostback被啟用)或者是一個被單擊的窗體提交按鈕。很多代碼都在這個事件中執行,因為這是控制事件驅動邏輯的理想位置。為了保證呈現到瀏覽器中數據的正確性,在一系列的回傳事件後,RaisePostBackEvent事件最終被激發。基於一致性的考慮,回傳中改變的控件直到這個函數被執行後才被更新。也就是說,被預期事件改變的數據總是在結果頁反映出來。RaisePostBackEvent事件也可以通過RaisePostBackEvent來捕捉。

PreRender

在該事件發生前:

· Page 對象會針對每個控件和頁調用 EnsureChildControls。

· 設置了 DataSourceID 屬性的每個數據綁定控件會調用 DataBind 方法。有關更多信息,請參見本主題後面的數據綁定控件的數據綁定事件。

頁上的每個控件都會發生 PreRender 事件。使用該事件對頁或其控件的內容進行最後更改。

SaveStateComplete

在該事件發生前,已針對頁和所有控件保存了 ViewState。將忽略此時對頁或控件進行的任何更改。

使用該事件執行滿足以下條件的任務:要求已經保存了視圖狀態,但未對控件進行任何更改。

Render

這不是事件;在處理的這個階段,Page 對象會在每個控件上調用此方法。所有 ASP.NET Web 服務器控件都有一個用於寫出發送給瀏覽器的控件標記的 Render 方法。

如果創建自定義控件,通常要覆蓋此方法以輸出控件的標記。不過,如果自定義控件只合並標準的 ASP.NET Web 服務器控件,不合並自定義標記,則不需要覆蓋 Render 方法。有關更多信息,請參見開發自定義 ASP.NET 服務器控件。

用戶控件(.ascx 文件)自動合並呈現,因此不需要在代碼中顯式呈現該控件。

Unload

該事件首先針對每個控件發生,繼而針對該頁發生。在控件中,使用該事件對特定控件執行最後清理,如關閉控件特定數據庫連接。

對於頁自身,使用該事件來執行最後清理工作,如:關閉打開的文件和數據庫連接,或完成日誌記錄或其他請求特定任務。

記憶的時候,可以記住幾大方面:Init ,Load,Render,Unload幾個大的事件,然後擴充細化即可。

c# 關於頁面生命周期