ASP.NET 網頁存留週期概觀

更新:2007 年 11 月

當執行 ASP.NET 網頁時,網頁在生命週期內會執行一系列處理步驟。其中包括初始化、產生控制項、還原和維護狀態、執行事件處理常式程式碼和呈現。了解網頁生命週期是很重要的,如此您就能在適當的生命週期階段撰寫程式碼,以達到所要的效果。此外,如果開發自訂控制項,就必須熟悉網頁生命週期進而正確初始化控制項、使用檢視狀態資料填入 (Populate) 控制項屬性,以及執行任何控制項行為程式碼。(控制項的生命週期是根據網頁的生命週期,但是網頁引發的控制項事件,比只有 ASP.NET 網頁時能夠使用的控制項事件更多)。

一般網頁生命週期階段

一般來說,網頁會歷經下表中所概要列出的階段。除了網頁生命週期階段外,在要求前後還存在應用程式階段,並非是網頁特有的。如需詳細資訊,請參閱IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀

階段

說明

網頁要求

在網頁生命週期開始前會發生網頁要求。當使用者要求網頁時,ASP.NET 會判斷是否需要剖析和編譯網頁 (因此開始網頁的生命週期),或是可以在不執行網頁的情況下,傳送網頁的快取版本做為回應。

開始

在開始步驟中,會設定像是 RequestResponse 的網頁屬性。在這個階段中,網頁也會判斷要求是否為回傳或是新的要求,然後設定 IsPostBack 屬性。此外,在開始步驟期間會設定網頁的 UICulture 屬性。

網頁初始化

在網頁初始化期間,可以使用網頁上的控制項,並且設定每個控制項的 UniqueID 屬性。任何佈景主題也會套用至網頁。如果目前的要求是回傳,則尚未載入回傳資料,並且控制項屬性值並未還原至檢視狀態提供的值。

載入

在載入期間,如果目前的要求是回傳,就會使用從檢視狀態和控制項狀態復原的資訊載入控制項屬性。

驗證

在驗證期間,會呼叫所有驗證程式控制項的 Validate 方法,以便設定個別驗證程式控制項和網頁的 IsValid 屬性。

回傳事件處理

如果要求是回傳,就會呼叫任何事件處理常式。

呈現

在呈現前,會儲存網頁和所有控制項的檢視狀態。在呈現階段期間,網頁會呼叫每個控制項的 Render 方法,提供文字寫入器將其輸出寫入網頁之 Response 屬性的 OutputStream

卸載

在網頁已經完整呈現、傳送至用戶端而且準備捨棄時會呼叫卸載。此時就會卸載像是 ResponseRequest 的網頁屬性,然後執行任何清除。

生命週期事件

在網頁生命週期的每個階段中,網頁會引發您能夠處理的事件,以便執行自己的程式碼。您可以使用像是 onclick 的屬性,以宣告方式將控制項事件的事件處理常式繫結至事件,或是在程式碼中處理。

網頁也支援自動事件連線,表示 ASP.NET 會尋找特定名稱的方法,並在引發某些事件時自動執行這些方法。如果 @ Page 指示詞的 AutoEventWireup 屬性設定為 true (或是未定義,則預設為 true),則會將網頁事件自動繫結到使用 Page_event 之命名規範的方法,例如 Page_Load 和 Page_Init。如需自動事件連線的詳細資訊,請參閱 ASP.NET Web 伺服器控制項事件模型

下表列出您會最常使用的網頁生命週期事件。除此之外,還有更多的事件沒有列出,但大多都不適用於多數的網頁處理案例。相反地,它們主要是 ASP.NET Web 網頁上的伺服器控制項,用來初始化和呈現階段本身。如果您要撰寫自己的 ASP.NET 伺服器控制項,您將需要了解更多有關這些階段的資訊。如需建立自訂控制項的詳細資訊,請參閱開發自訂的 ASP.NET 伺服器控制項

網頁事件

一般用法

PreInit

這個事件可以用於下列各項:

  • 檢查 IsPostBack 屬性判斷是否是第一次處理網頁。

  • 建立或重新建立動態控制項。

  • 動態設定主版頁面。

  • 動態設定 Theme 屬性。

  • 讀取或設定設定檔屬性值。

    注意事項:
    如果要求是回傳,控制項的值尚未從檢視狀態還原。如果在這個階段設定控制項屬性,則在下一個物件中可能會覆寫其值。

Init

在初始化所有控制項並套用任何面板設定之後引發。這個事件可以用於讀取或初始化控制項屬性。

InitComplete

Page 物件引發。這個事件可以用於處理需要完成所有初始設定的工作。

PreLoad

如果需要在 Load 事件之前先處理網頁或控制項,請使用這個物件。

Page 引發這個事件之後,會先載入其本身和所有控制項的檢視狀態,再處理 Request 執行個體 (Instance) 所包含的任何回傳資料。

Load

Page 會先呼叫 Page 上的 OnLoad 事件方法,再遞迴地為每個子控制項執行相同動作,它會為其每個子控制項執行相同動作,直到載入完網頁和所有控制項為止。

OnLoad 事件方法可以用於設定控制項中的屬性,以及建立資料庫連接。

控制項事件

這些控制項事件可以用於處理特定控制項事件,例如 Button 控制項的 Click 事件,或 TextBox 控制項 TextChanged 事件。

注意事項:
在回傳要求中,如果網頁包含驗證程式控制項,則在執行任何處理之前,請先檢查 Page 和個別驗證控制項的 IsValid 屬性。

LoadComplete

這個事件可以用於需要載入網頁上所有其他控制項的工作。

PreRender

在這個事件發生之前:

  • Page 物件會呼叫每個控制項和網頁的 EnsureChildControls

  • 每個已設定其 DataSourceID 屬性的資料繫結控制項會呼叫其 DataBind 方法。如需詳細資訊,請參閱本主題稍後的資料繫結控制項的資料繫結事件。

每個控制項的 PreRender 事件都會發生在網頁上。這個事件可以用於對網頁或其控制項的內容進行最終的變更。

SaveStateComplete

網頁和所有控制項的 ViewState 在這個事件發生之前就已儲存了。在這之後對網頁或控制項所做的任何變更都將會被忽略。

這個事件可以用於執行需要儲存檢視狀態但不對控制項做任何變更的工作。

Render

這個不是一個事件;相反地,在這個處理階段,Page 物件會呼叫每個控制項上的這個方法。所有 ASP.NET Web 伺服器控制項都有 Render 方法,它可以寫出傳送至瀏覽器之控制項的標記。

如果您建立自訂控制項,通常會覆寫這個方法,以便輸出控制項的標記。不過,如果自訂控制項只包含標準 ASP.NET Web 伺服器控制項且無任何自訂標記,就不需要覆寫 Render 方法。如需詳細資訊,請參閱 開發自訂的 ASP.NET 伺服器控制項

使用者控制項 (.ascx 檔案) 自動會包含呈現,因此不需要在程式碼中明確呈現控制項。

Unload

這個事件會先發生在每個控制項上,然後才發生在網頁上。在控制項中,這個事件可以用於對特定控制項執行最終清除,例如關閉控制項特定的資料庫連接。

對於網頁本身,這個事件可以用於執行最終清除工作,例如關閉開啟中的檔案或資料庫連接,或是結束登入或其他要求特定的工作。

注意事項:
在卸載階段期間就已經呈現網頁和其控制項,因此您無法對回應資料流做進一步變更。如果您嘗試呼叫像是 Response.Write 的方法,網頁就會擲回例外狀況。

網頁生命週期的其他考量

個別 ASP.NET 伺服器控制項有自己的生命週期,其類似網頁的生命週期。例如,在對應的網頁事件期間,控制項的 InitLoad 事件會發生。

雖然 InitLoad 遞迴地發生在每個控制項上,但卻以相反順序發生。在每個子控制項的 Init 事件 (以及還有 Unload 事件) 發生之後,才會引發其容器的對應事件 (由下而上)。不過,容器的 Load 事件會在其子控制項的 Load 事件之前發生 (由上而下)。

藉由處理控制項的事件,例如 Button 控制項的 Click 事件和 ListBox 控制項 SelectedIndexChanged 事件,您可以自訂控制項的外觀或內容。在某些情況下,您也會處理控制項的 DataBindingDataBound 事件。如需詳細資訊,請參閱個別控制項的類別參考主題,以及開發自訂的 ASP.NET 伺服器控制項

當自 Page 類別繼承類別時,除了處理網頁引發的事件之外,您還可以覆寫來自網頁之基底類別 (Base Class) 的方法。例如,您可以覆寫網頁的 InitializeCulture 方法,以便動態設定文化資訊。請注意,使用 Page_event 語法建立事件處理常式時,便會隱含地呼叫基底實作,因此並不需要另外在方法中呼叫。例如,不論您是否建立 Page_Load 方法,都會呼叫基底網頁類別的 OnLoad 方法。然而,如果您使用 override 關鍵字 (在 Visual Basic 中為 Overrides) 覆寫網頁 OnLoad 方法,就必須明確呼叫基底方法。例如,如果您覆寫網頁上的 OnLoad 方法,就必須呼叫 base.Load (在 Visual Basic 中為 MyBase.Load) 以便執行基底實作。

新增的控制項之 Catch-up 事件

如果控制項是以動態方式在執行階段建立的,或是以宣告方式在資料繫結控制項的樣板 (Template) 內撰寫的,則其事件在一開始時並不會和網頁上的其他控制項同步。例如,對於在執行階段加入的控制項,InitLoad 事件在網頁生命週期中可能會比以宣告方式建立的控制項之相同事件更晚發生。因此,在產生以動態方式加入的控制項和樣板中的控制項時,會一個接著一個引發其事件,直到這些事件趕上了被加到 Controls 集合中時的事件。

一般說來,除非有巢狀資料繫結控制項,否則並不需要在意這種情況。如果已經對子控制項進行資料繫結,但尚未對其容器控制項進行資料繫結,則子控制項中的資料和其容器控制項中的資料可能會不同步,特別是如果子控制項中的資料是根據容器控制項中的資料繫結值而進行處理的話,更是會發生這種情形。

例如,假設您有 GridView,它會在每個資料列中顯示公司記錄,以及在 ListBox 控制項中顯示公司高幹清單。為了填寫高幹清單,您會將 ListBox 控制項繫結至資料來源控制項 (例如 SqlDataSource),而後者可在查詢中使用 CompanyID 擷取公司高幹資料。

如果以宣告方式設定 ListBox 控制項的資料繫結屬性 (例如 DataSourceIDDataMember),則 ListBox 控制項將在包含的資料列之 DataBinding 事件期間嘗試繫結至其資料來源。不過,在 GridView 控制項的 RowDataBound 事件發生之前,資料列的 CompanyID 欄位不會包含值。在這樣的情況下,會先對子控制項 (ListBox 控制項) 進行繫結,然後再對包含的控制項 (GridView 控制項) 進行繫結,所以它們的資料繫結階段就不同步了。

為了避免這種情況,最好在和 ListBox 控制項本身所在的相同樣板項目中放置 ListBox 控制項的資料來源控制項,並且不要以宣告方式設定 ListBox 的資料繫結 (Data Binding) 屬性,而是以程式設計方式在 RowDataBound 事件期間於執行階段設定,這樣在取得 CompanyID 資訊之前,ListBox 控制項就不會繫結至其資料。

如需詳細資訊,請參閱使用資料來源控制項繫結至資料

資料繫結控制項的資料繫結事件

為了協助您了解網頁生命週期和資料繫結事件之間的關聯性 (Relationship),下表列出資料繫結控制項 (例如 GridViewDetailsViewFormView 控制項) 中的資料相關事件。

控制項事件

一般用法

DataBinding

這個事件是由資料繫結控制項在包含的控制項 (或 Page 物件) 之 PreRender 事件前所引發,而且會將控制項的繫結開頭標記為資料。

如果需要的話,這個事件可以用於手動開啟資料庫連接 (但通常資料來源控制項會將此認為不需要)。

RowCreated (僅限 GridView) 或 ItemCreated (DataListDetailsViewSiteMapPathDataGridFormViewRepeaterListView 控制項)

這個事件可以用於管理不與資料繫結相依的內容。例如,在執行階段,您可能會以程式設計方式將格式加入 GridView 控制項中的頁首或頁尾資料列。

RowDataBound (僅限 GridView) 或 ItemDataBound (DataListSiteMapPathDataGridRepeaterListView 控制項)

當這個事件發生時,資料可以在資料列或項目中使用,因此您可以格式化資料,或者設定子資料來源控制項上的 FilterExpression 屬性,進而在資料列或項目內顯示相關的資料。

DataBound

這個事件會在資料繫結控制項中標記資料繫結作業的最後部分。在 GridView 控制項中,所有資料列和任何子控制項的資料繫結已經完成。

這個事件可以用於格式化資料繫結內容,或是在其他相依於來自目前控制項內容之值的控制項中啟始資料繫結 (如需詳細資訊,請參閱本主題前面所述的「新增的控制項之 Catch-up 事件」)。

Login 控制項事件

Login 控制項可以使用 Web.config 檔案中的設定,自動管理成員資格驗證。然而,如果應用程式要求您自訂控制項運作的方式,或者如果您想要了解 Login 控制項與網頁生命週期關聯的方式,可以使用下表所列的事件。

控制項事件

一般用法

LoggingIn

在發生網頁的 LoadComplete 事件之後,這個事件會在回傳時引發。它會標記登入程序的開頭部分。

這個事件可以用於在開始驗證程序之前必須發生的工作。

Authenticate

這個事件會在 LoggingIn 事件之後引發。

這個事件可以用於覆寫或變更 Login 控制項的預設驗證行為。

LoggedIn

這個事件會在使用者名稱和密碼已通過驗證之後引發。

這個事件可以用於重新導向至其他網頁,或以動態方式設定控制項中的文字。如果有錯誤或驗證失敗,這個事件就不會發生。

LoginError

如果驗證失敗,就會引發這個事件。

這個事件可以用於設定控制項中的文字 (說明問題的原因),或將使用者導向至其他網頁。

請參閱

概念

ASP.NET Web 伺服器控制項事件模型

ASP.NET Web 應用程式中的網頁和應用程式內容

ASP.NET 檢視狀態概觀

使用資料來源控制項繫結至資料

參考

驗證 ASP.NET Web 網頁中的使用者輸入

ASP.NET 登入控制項概觀

其他資源

開發自訂的 ASP.NET 伺服器控制項

ASP.NET Web 網頁語法

ASP.NET Web 網頁中的伺服器事件處理