天天看點

自定義伺服器控件中的事件

  自定義伺服器控件也有自己的生命周期,它與頁面生命周期幾乎經曆着同樣的生命同期過程,比如OnInit事件它發生在頁面OnInit事件之前,控件的Load事件發生在頁面Load事件之後,PreRender事件發生在頁面PreRender事件之後

Render事件發生在頁面Render事件之後,Unload事件發生在頁面Unload事件之前,總之,它也分為6個階段:

 1.初始化

 2.加載

 3.事件處理

 4.驗證

 5.呈現

  6.解除安裝

A.初始化階段的事件包括PreInit與Init事件,InitCompleted事件它們分别對應頁面方法OnPreInit(),OnInit(),OnInitCompleted()方法.其中PreInit事件與InitCompleted事件是Page對象特有,其中頁面的方法還有Construct()(構造函數),ProcessRequest()方法

InitializeCulture()方法(初始化文化資訊)TrackViewState()(跟蹤視圖狀态,使得架構能記錄ViewState的狀态更改,這個方法調用發生在Init事件與InitCompleted事件之間,PreInit事件一般用來設定主要頁,Theme主題屬性,設定IsPostBack,UICultrue屬性,讀取或設定配置檔案屬性值.Init事件發生在所有控件已初始化且已應用所有外觀設定後引後。使用此事件來初始化控件屬性

B.頁面為自身和控件加載視圖狀态(如果頁面上設定了屬性EnableViewState為false,則不加載視圖狀态,一般視圖狀态放在一個隐藏控件中傳送)-》頁面調用OnPreLoad()方法引發PreLoad事件-》引發Load事件--》遞歸調用頁面中的子控件的OnLoad()方法,引發LOad事件,Page類的OnLoad()方法會自動的調用,但如果你重寫了OnLoad()方法則要顯示的調用它base.OnLoad(e);

C.事件處理(RaisePostBackEvent)這個是引起回發事件,能夠處理回發的控件必須實作System.web.UI.IPostbackDataHandler接口,此接口允許控件确定是否在回發改變後其狀态以及引發相應的事件,它有兩個方法public bool LoadPostData(String postDataKey,NameValueCollection collection);public void RaisePostChangedEvent();如果LoadPostData方法傳回True,則頁面架構在跟蹤此控件時發現傳回True ,則調用RaisePostChangedEvent()方法,該方法引發更改事件TextChanged事件,TextChanged事件在頁面中可能訂閱事件處理程式(OnTextChanged="Text_Changed")進而引發事件.

D.驗證(Validate)驗證發生在裝載與頁面事件之後,是以在此之前如果要驗證資料有效性,必須用到IsValidate屬性

E.呈現頁面中的OnLoadComplete()方法引發LoadCompleted事件,OnPreRender方法引發preRender事件-->控件DataBind()方法-->調用OnDataBind()方法-->引發資料綁定事件-->OnPreRenderCompleted()引發PreRenderComplete事件-->SaveViewState()儲存視圖狀态與控件狀态-->OnSaveStateComplete()方法引發SaveStateComplete事件-->RendControl()-->Render()-->RenderChildren()

F.解除安裝OnUnload()引發unload事件-->dispose()

ASP.NET 頁生命周期概述

ASP.NET 頁運作時,此頁将經曆一個生命周期,在生命周期中将執行一系列處理步驟。這些步驟包括初始化、執行個體化控件、還原和維護狀态、運作事件處理程式代碼以及進行呈現。了解頁生命周期非常重要,因為這樣做您就能在生命周期的合适階段編寫代碼,以達到預期效果。

如果您要開發自定義控件,就必須熟悉頁生命周期,以便正确進行控件初始化,使用視圖狀态資料填充控件屬性以及運作控件行為代碼。控件的生命周期基于頁的生命周期,但是頁引發許多您需要在自定義控件中處理的事件。

本主題包含以下各節:

  • 正常頁生命周期階段
  • 生命周期事件
  • 其他的頁生命周期注意事項
  • 添加的控件的追趕事件
  • 資料綁定控件的資料綁定事件
  • 登入控件事件

正常頁生命周期階段

一般來說,頁要經曆下表概述的各個階段。除了頁生命周期階段以外,在請求前後還存在應用程式階段,但是這些階段并不特定于頁。有關更多資訊,請參見 Introduction to the ASP.NET Application Life Cycle and IIS 7.0 的 ASP.NET 應用程式生命周期概述(ASP.NET 應用程式生命周期簡介)。

生命周期的某些部分僅當頁處理為回發時才出現。對于回發,部分頁回發過程中(當您使用 UpdatePanel 控件)與整頁回發過程中的頁生命周期是一樣。

階段 說明
頁請求 頁請求發生在頁生命周期開始之前。使用者請求頁時,ASP.NET 将确定是否需要分析和編譯頁(進而開始頁的生命周期),或者是否可以在不運作頁的情況下發送頁的緩存版本以進行響應。
啟動 在啟動階段,将設定頁屬性,如 Request 和 Response。在此階段,頁還将确定請求是回發請求還是新請求,并設定 IsPostBack 屬性。頁還設定 UICulture 屬性。
初始化 頁初始化期間,可以使用頁中的控件,并将設定每個控件的 UniqueID 屬性。如果需要,還會向頁應用于母版頁和主題。如果目前請求是回發請求,則回發資料尚未加載,并且控件屬性值尚未還原為視圖狀态中的值。
加載 加載期間,如果目前請求是回發請求,則将使用從視圖狀态和控件狀态恢複的資訊加載控件屬性。
回發事件處理 如果請求是回發請求,則将調用控件事件處理程式。之後,将調用所有驗證程式控件的 Validate 方法,此方法将設定各個驗證程式控件和頁的 IsValid 屬性。
呈現 在呈現之前,會針對該頁和所有控件儲存視圖狀态。在呈現階段中,頁會針對每個控件調用 Render 方法,它會提供一個文本編寫器,用于将控件的輸出寫入頁的 Response 屬性的 OutputStream 對象中。
解除安裝 完全呈現頁并已将頁發送至用戶端、準備丢棄該頁後,将引發 Unload 事件。此時,将解除安裝頁屬性(如 Response 和 Request)并執行清理。

生命周期事件

在頁生命周期的每個階段中,頁将引發可運作您自己的代碼進行處理的事件。對于控件事件,通過以聲明方式使用特性(如 onclick)或以使用代碼的方式,均可将事件處理程式綁定到事件。

頁還支援自動事件連接配接,即,ASP.NET 将查找具有特定名稱的方法,并在引發了特定事件時自動運作這些方法。如果 @ Page 指令的 AutoEventWireup 特性設定為 true,頁事件将自動綁定至使用命名約定 Page_事件(如 Page_Load 和 Page_Init)的方法。有關自動事件連接配接的更多資訊,請參見 ASP.NET Web 伺服器控件事件模型。

下表列出了最常用的頁生命周期事件。除了列出的事件外還有其他事件;不過,大多數頁處理方案不使用這些事件。而是主要由 ASP.NET 網頁上的伺服器控件使用,以初始化和呈現它們本身。如果要編寫自定義 ASP.NET 伺服器控件,則需要詳細了解這些事件。有關建立自定義控件的資訊,請參見開發自定義 ASP.NET 伺服器控件。

頁事件 典型使用
PreInit

在啟動階段完成之後、初始化階段開始之前引發。

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

  • 檢查 IsPostBack 屬性來确定是不是第一次處理該頁。此時還設定了 IsCallback 和 IsCrossPagePostBack 屬性。
  • 建立或重新建立動态控件。
  • 動态設定主要頁。
  • 動态設定 Theme 屬性。
  • 讀取或設定配置檔案屬性值。
    自定義伺服器控件中的事件
    說明 如果請求是回發請求,則控件的值尚未從視圖狀态還原。如果在此階段設定控件屬性,則其值可能會在下一事件中被覆寫。
Init

在所有控件都已初始化且已應用所有外觀設定後引發。各個控件的 Init 事件在頁的 Init 事件之前發生。

使用該事件來讀取或初始化控件屬性。

InitComplete

在頁的初始化階段結束時引發。Init 和 InitComplete 事件之間僅發生一個操作:開啟對視圖狀态更改的跟蹤。視圖狀态跟蹤使控件可以保留所有以程式設計方式添加到 ViewState 集合的值。在開啟視圖狀态跟蹤之前,所有添加到視圖狀态的值都會在回發期間丢失。控件通常在引發其 Init 事件後立即開啟視圖狀态跟蹤。

使用此事件對要在下一個回發後務必保留的視圖狀态進行更改。

PreLoad 在頁為自身和所有控件加載視圖狀态之後以及處理 Request 執行個體包括的回發資料之後引發。
Load

Page 對象對 Page 對象調用 OnLoad 方法,然後以遞歸方式對每個子控件執行相同操作,直到加載完本頁和所有控件為止。各個控件的 Load 事件在頁的 Load 事件之後發生。

使用 OnLoad 事件方法來設定控件中的屬性并建立資料庫連接配接。

控件事件 使用這些事件來處理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
自定義伺服器控件中的事件
說明 在回發請求中,如果頁包含驗證程式控件,請在執行任何處理之前檢查 Page 和各個驗證控件的 IsValid 屬性。
LoadComplete

在事件處理階段結束時引發。

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

PreRender

在 Page 對象建立呈現頁所需的所有控件(包括組合控件的子控件)之後引發。(為���,Page 對象會針對每個控件和頁調用 EnsureChildControls。)

Page 對象在 Page 對象上調用 PreRender 事件,然後以遞歸方式對每個子控件執行相同操作。各個控件的 PreRender 事件在頁的 PreRender 事件之後發生。

在呈現階段開始之前,使用該事件對頁或其控件的内容進行最後更改。

PreRenderComplete 在設定了 DataSourceID 屬性的每個資料綁定控件調用其 DataBind 方法之後引發。有關更多資訊,請參見本主題後面的資料綁定控件的資料綁定事件。
SaveStateComplete 在為頁和所有控件儲存視圖狀态和控件狀态之後發生。此時對頁或控件進行的任何更改都會影響呈現,但是在下一個回發中将不會檢索到這些更改。
Render

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

如果建立自定義控件,通常要覆寫此方法以輸出控件的标記。不過,如果自定義控件隻合并标準的 ASP.NET Web 伺服器控件,不合并自定義标記,則不需要覆寫 Render 方法。有關更多資訊,請參見開發自定義 ASP.NET 伺服器控件。

使用者控件(.ascx 檔案)自動合并呈現,是以不需要在代碼中顯式呈現該控件。

Unload

首先針對每個控件引發,繼而針對該頁引發。

在控件中,使用該事件對特定控件執行最後清理,如關閉控件特定資料庫連接配接。

對于頁自身,使用該事件來執行最後清理工作,如:關閉打開的檔案和資料庫連接配接,或完成日志記錄或其他請求特定任務。

自定義伺服器控件中的事件
說明 在解除安裝階段,頁及其控件已被呈現,是以無法對響應流做進一步更改。如果嘗試調用方法(如 Response.Write 方法),則該頁将引發異常。

其他的頁生命周期注意事項

各個 ASP.NET 伺服器控件都有自己的生命周期,該生命周期與頁生命周期類似。例如,控件的 Init 和 Load 事件在相應的頁事件期間發生。

雖然 Init 和 Load 都在每個控件上以遞歸方式發生,但它們的發生順序相反。每個子控件的 Init 事件(還有 Unload 事件)在為其容器引發相應的事件之前發生(由下到上)。但是,容器的 Load 事件是在其子控件的 Load 事件之前發生(由上到下)。

當您建立從 Page 類繼承的類時,除了可以處理由頁引發的事件以外,還可以重寫頁的基類中的方法。例如,可以覆寫頁的 InitializeCulture 方法,以便動态設定區域性資訊。注意,在使用 Page_事件 文法建立事件處理程式時,将隐式調用基實作,是以無需在方法中調用它。例如,無論是否建立 Page_Load 方法,始終都會調用頁基類的 OnLoad 方法。但是,如果使用 override 關鍵字(在 Visual Basic 中為 Overrides)覆寫頁的 OnLoad 方法,則必須顯式調用基方法。例如,如果在頁中覆寫 OnLoad 方法,則必須調用 base.Load(在 Visual Basic 中為 MyBase.Load)以運作基實作。

下圖顯示了 Page 類的一些最重要方法,您可以對其進行重寫以便添加在頁生命周期的特定點執行的代碼。(有關頁方法和事件的完整清單,請參見 Page 類。)該圖還示範這些方法如何與頁事件和控件事件相關。在該圖中方法和事件的順序為從上到下排列,在每行中為從左到右。

自定義伺服器控件中的事件
自定義伺服器控件中的事件

添加的控件的追趕事件

如果控件是在運作時動态建立的,或者是以聲明方式在資料綁定控件的模闆中建立的,它們的事件最初與頁上的其他控件的事件并不同步。例如,對于運作時添加的控件,Init 和 Load 事件在頁生命周期中的發生時間可能要比以聲明方式建立的控件的相同僚件晚得多。是以,從執行個體化那一刻起,動态添加的控件的事件就一直是在模闆中的控件的事件之後發生,直到趕上該控件加入 Controls 集合時所對應事件為止。

資料綁定控件的資料綁定事件

為了幫助您了解頁生命周期與資料綁定事件之間的關系,下表列出了資料綁定控件(如 GridView、DetailsView 和 FormView 控件)中與資料相關的事件。

控件事件 典型使用
DataBinding

在控件的 PreRender 事件(該事件在頁的 PreRender 事件之���發生)之後引發。(這将應用于以聲明方式設定其屬性的 DataSourceID 控件。否則,該事件在您調用控件的 DataBind 方法時發生。)

該事件标記将控件綁定到資料的程序的開始。使用此事件可以手動打開資料庫連接配接,如果需要,還可以在運作查詢之前動态設定參數值。

RowCreated(僅限 GridView)或 ItemCreated(DataList、DetailsView、SiteMapPath、DataGrid、FormView、Repeater 和 ListView 控件)

在控件的 DataBinding 事件之後引發。

使用該事件來操作不依賴于資料綁定的内容。例如,在運作時,可以以程式設計方式向 GridView 控件中的頁眉或頁腳行添加格式。

RowDataBound(僅限 GridView)或 ItemDataBound(DataList、SiteMapPath、DataGrid、Repeater 和 ListView 控件)

在控件的 RowCreated 或 ItemCreated 事件之後引發。

當此事件發生時,行或項中的資料可用,是以,可以在子資料源控件上格式化資料或設定 FilterExpression 屬性,以便顯示行或項中的相關資料。

DataBound

在資料綁定控件中的資料綁定操作結尾引發。在 GridView 控件中,會為所有行和子控件完成資料綁定。

使用此事件格式化資料綁定内容,或在依賴來自目前控件的内容的值的其他控件中啟動資料綁定。(有關更多資訊,請參見本主題中前面的“添加的控件的追趕事件”。)

嵌套的資料綁定控件

如果子控件已執行資料綁定,但其容器控件尚未執行資料綁定,則子控件中的資料與其容器控件中的資料可能不同步。如果子控件中的資料根據容器控件中的資料綁定值執行了處理,這種情況則尤其顯著。

例如,假定有一個 GridView 控件,它的每一行顯示一條公司記錄,此外,還有一個 ListBox 控件包含公司管理者清單。若要填充管理者清單,則需要将 ListBox 控件綁定到一個資料源控件(如 SqlDataSource),後者在查詢中使用公司 ID 來檢索公司管理者資料。

如果以聲明方式設定了 ListBox 控件的資料綁定屬性(如 DataSourceID 和 DataMember),ListBox 控件将嘗試在包含行的 DataBinding 事件期間綁定到其資料源。不過,行的 CompanyID 字段直到 GridView 控件的 RowDataBound 事件發生後才包含值。這種情況下,先綁定子控件(ListBox 控件),後綁定包含控件(GridView 控件),是以它們的資料綁定階段并不同步。

若要避免此種情況,需要将 ListBox 控件的資料源控件與 ListBox 控件自身放在同一模闆項中,并且不要以聲明方式設定 ListBox 的資料綁定屬性。而應在 RowDataBound 事件期間在運作時以程式設計方式設定它們,這樣,到 CompanyID 資訊可用時 ListBox 控件才會綁定到其資料。

有關更多資訊,請參見使用資料源控件綁定到資料。

登入控件事件

Login 控件可以使用 Web.config 檔案中的設定來自動管理成員資格驗證。不過,如果應用程式要求您自定義控件的工作方式,或者您要了解 Login 控件事件與頁生命周期的關聯方式,可以使用下表中列出的事件。

控件事件 典型使用
LoggingIn

在回發期間,當頁的 LoadComplete 事件發生後引發。此事件标記登入過程的起點。

對必須在驗證過程開始前發生的任務使用該事件。

Authenticate

在 LoggingIn 事件之後引發。

使用該事件來覆寫或增強 Login 控件的預設驗證行為。

LoggedIn

在驗證使用者名和密碼後引發。

使用該事件來重定向到另一個頁或動态設定控件中的文本。如果出現錯誤或驗證失敗,就不會發生該事件。

LoginError

在身份驗證失敗的情況下引發。

使用該事件來設定控件中的問題解釋文本或将使用者定向到不同的頁。

請參見

參考

在 ASP.NET 網頁中驗證使用者輸入 ASP.NET 登入控件概述

概念

ASP.NET Web 伺服器控件事件模型 ASP.NET Web 應用程式中的頁和應用程式上下文 ASP.NET 視圖狀态概述 使用資料源控件綁定到資料

其他資源

開發自定義 ASP.NET 伺服器控件 ASP.NET 頁文法 ASP.NET 網頁中的伺服器事件處理