Share via


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

更新:2007 年 11 月

ASP.NET 的一項重要功能就是它可讓您使用類似於在用戶端應用程式使用的事件架構模型,以進行 Web 網頁的程式設計。簡單的範例是,您可以將按鈕加入至 ASP.NET Web 網頁,然後撰寫此按鈕之 Click 事件的事件處理常式。雖然在 Web 網頁中通常只使用用戶端指令碼 (藉由在動態 HTML 中處理按鈕的 onclick 事件),ASP.NET 將此模型提供到伺服器端處理。

ASP.NET 伺服器控制項所引發的事件與傳統 HTML 網頁或用戶端 Web 應用程式中發生的事件,在運作上稍有不同。造成這種差異的主要是因為將事件本身與處理事件的地方加以區隔所致。在用戶端架構應用程式中,事件是在用戶端上引發和處理。但是,在 ASP.NET Web 網頁中,事件與源自於用戶端 (瀏覽器) 的伺服器控制項關聯,但由 ASP.NET Web 網頁在 Web 伺服器上處理。

針對在用戶端上引發的事件,ASP.NET Web 控制項事件模型會要求在用戶端上擷取事件資訊,然後透過 HTTP 傳送將事件訊息傳送到伺服器。網頁必須解譯張貼來判斷發生的事件為何,接著在伺服器上呼叫您程式碼中適當的方法來處理事件。

ASP.NET 會處理擷取、傳輸和解譯事件的工作。當您在 ASP.NET Web 網頁中建立事件處理常式時,通常不需考慮要如何擷取事件資訊以及如何讓程式碼可使用這些資訊,即可這麼做。您可以利用像在傳統用戶端表單的相同方式來建立事件處理常式。但是,在 ASP.NET Web 網頁中處理事件還是有些方面是您應該注意的。

伺服器控制項和頁面的事件集

因為多數 ASP.NET 伺服器控制項事件都需要來回伺服器以進行處理,所以它們可能會影響網頁的效能。因此,有些伺服器控制項提供了有限的事件集,通常都是按鍵類型的事件。某些伺服器控制項支援 Change 事件。例如,CheckBox Web 伺服器控制項會在使用者按該方塊時引發 CheckedChanged 事件。某些伺服器控制項支援更抽象的事件。例如,Calendar Web 伺服器控制項會引發 SelectionChanged 事件,它是更為抽象的 Click 事件版本。

伺服器控制項不支援時常發生 (以及在使用者不知情的狀況下引發) 的事件,例如 onmouseover 事件。ASP.NET 伺服器控制項仍可以呼叫用戶端處理常式來處理這些事件,這在稍後的ASP.NET Web 伺服器控制項事件模型中說明。

控制項和頁面本身也會在每個處理步驟中引發生命週期事件,例如 Init、Load 和 PreRender。您可以在應用程式中利用這些生命週期事件。例如,在頁面的 Load 事件中,您可以設定控制項的預設值。

事件引數

伺服器端 ASP.NET 網頁和控制項事件都會遵循事件處理常式方法的標準 .NET Framework 模式。所有事件都會傳遞兩個引數:一個物件,代表引發事件的物件,以及一個事件物件,含有事件的任何專屬資訊。第二個引數通常為 EventArgs 型別,但是對於某些控制項,它可能是該控制項專用的型別。例如,對 ImageButton Web 伺服器控制項的第二個引數為 ImageClickEventArgs 的型別,它包含了使用者所按座標的資訊。

注意事項:

網頁的事件 (例如,網頁的 Load 事件) 可以接受標準的兩個引數,但在這些引數中不會傳遞值。

伺服器控制項中的回傳和非回傳事件

在伺服器控制項中,某些事件 (通常是 Click 事件) 會導致網頁立即貼回到伺服器。有些 HTML 伺服器控制項和 Web 伺服器控制項 (例如 TextBox 控制項) 不會立即回傳。而是它們會在下次張貼發生時引發。

注意事項:

如果瀏覽器支援的話,驗證控制項會使用用戶端指令碼檢查使用者輸入,而不需往返於伺服器之間。如需詳細資訊,請參閱驗證 ASP.NET Web 網頁中的使用者輸入

在回傳頁面後,會引發頁面的初始化事件 (Page_Init 和 Page_Load),然後處理控制項事件。除非您對網頁事件處理已相當熟悉,否則您不應建立依賴以特定順序引發的變更事件的應用程式邏輯。如需詳細資訊,請參閱 ASP.NET 網頁存留週期概觀

如果這對您的應用程式很有用,您可以指定 Change 事件引發頁面張貼。支援 Change 事件的 Web 伺服器控制項有一個 AutoPostBack 屬性。當這個屬性為 true 時,控制項的 Change 事件就會立即導致張貼頁面,而不需等候 Click 事件。例如,根據預設,CheckBox 控制項的 CheckedChanged 事件不會使網頁送出。但是,如果您將控制項的 AutoPostBack 屬性設定為 true,只要使用者按下核取方塊,網頁就會傳送到伺服器處理。

注意事項:

若要讓 AutoPostBack 屬性正常執行,使用者的瀏覽器必須設定為允許指令碼處理。這也是大部分情況下的預設值。不過,有些使用者會基於安全的理由而停用指令碼處理。如需詳細資訊,請參閱 ASP.NET Web 網頁中的用戶端指令碼

轉送的事件

有些 Web 伺服器控制項 (例如 RepeaterDataListGridViewFormViewDetailsView 控制項) 可以含有自行引發事件的按鈕。例如,GridView 控制項的每個資料列都可以包含以範本動態建立的一或多個按鈕。

和每個按鈕個別引發事件不同,來自巢狀控制項的事件會轉送至容器控制項。而容器再依次引發泛型 ItemCommand 事件,其參數可讓您探索引發原始事件的個別控制項。您只需回應這個單一事件,而不必再為子控制項撰寫個別的事件處理常式。

ItemCommand 事件含有兩個標準的事件引數,一個參考事件來源的物件,另一則是包含事件特定資訊的事件物件。

注意事項:

GridViewDataList 和其他資料控制項都支援其他事件,例如 EditCommand、DeleteCommand 和 UpdateCommand,這些是轉送事件的特殊狀況。

對於按鈕,您可以使用 CommandArgument 屬性將使用者指定的字串傳遞給事件處理常式,協助您識別是哪一個按鈕引發了事件。例如,在 DataList 控制項中,有一些按鈕會引發 ItemCommand 事件。您可以將每一按鈕的 CommandArgument 屬性設定為不同的值 (例如一個按鈕的值為 "ShowDetails",而另一個按鈕的值為 "AddToShoppingCart"),並於稍後從事件處理常式中擷取這些值。

將事件繫結到方法

事件是如「按鈕已按下」的這種訊息。在應用程式中,訊息必須在您的程式碼中轉譯為方法呼叫。在事件訊息和特定方法之間的繫結,也就是事件處理常式,是使用事件委派來達成。如需詳細資訊,請參閱事件和委派

在 ASP.NET Web 網頁中,如果控制項是以宣告方式 (在標記中) 在網頁上建立,則不需要明確程式碼委派。事件繫結可以使用不同的方式完成,這視要繫結什麼事件和使用哪種程式語言而定。如需詳細資訊,請參閱 HOW TO:在 ASP.NET Web 網頁中建立事件處理常式

繫結控制項事件

對於在網頁上宣告的控制項,可以設定控制項之標記中的屬性,將事件繫結到方法。下列程式碼範例說明如何將 ASP.NET Button 控制項的 Click 事件,繫結到名為 ButtonClick 的方法。

<asp:button id="SampleButton"  
   text="Submit" onclick="ButtonClick" />

當編譯網頁時,ASP.NET 會尋找名為 ButtonClick 的方法,並確認該方法有正確的簽章 (它接受兩個引數,一個是 Object 型別,另一個是 EventArgs 型別)。然後 ASP.NET 自動將事件繫結到方法。

在 Visual Basic 中,您可以在事件處理常式宣告中使用 Handles 關鍵字以替代繫結事件至方法,如下列程式碼範例所示:

Private Sub ButtonClick(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles SampleButton.Click

繫結網頁事件

ASP.NET 網頁會引發如 Init、 Load、 PreRender 等等的生命週期事件。根據預設,您可以使用 Page_eventname 的命名慣例,將網頁事件繫結至方法。例如,若要建立網頁之 Load 事件的處理常式,您可以建立名稱為 Page_Load 的方法。在編譯時期,ASP.NET 會根據此命名慣例尋找方法,並自動執行事件和方法之間的繫結。您可以為 Page 類別所公開的任何事件使用 Page_eventname 的命名慣例。

注意事項:

頁面事件處理方法不需要任何引數。

如果想要的話,可以明確地建立處理常式。根據方法命名慣例的網頁事件自動繫結是由 AutoEventWireup 網頁屬性所控制。根據預設,此屬性是設定為 true,且 ASP.NET 會如先前所描述執行自動查找和繫結。或者,您也可以在 @ Page 指示詞中加入 AutoEventWireup=false 屬性 (Attribute),藉以將此屬性 (Property) 設定為 false。然後您可以使用任意名稱建立方法,並將它們明確繫結到網頁事件。在 Visual Basic 中,可以使用 Handles 關鍵字,如下列程式碼範例所示:

Sub MyPageLoad(sender As Object, e As EventArgs) Handles MyBase.Load

AutoEventWireup 屬性的缺點是,它需要網頁事件處理常式具有可預期的特定名稱。這樣將會限制您對事件處理常式命名的彈性。

注意事項:

如果包含頁面事件的明確繫結,請確定 AutoEventWireup 屬性已設為 false,這樣才不會不慎地呼叫方法兩次。

動態控制項的明確繫結

如果是藉由在標記中宣告來建立控制項,您可以使用屬性 (例如,onclick),或是在 Visual Basic 中使用 Handles 關鍵字,將事件繫結至方法。如果動態建立控制項 (在程式碼中),您無法使用上述的任一種方法,因為編譯器在編譯階段沒有針對控制項的參考。

在這種情況下,必須使用明確事件繫結。在 Visual Basic 中,您可以使用 AddHandler 陳述式將動態建立之控制項中的事件,繫結至現有的方法。在 C# 中,您建立委派並將其與控制項的事件關聯起來。下列程式碼範例會顯示如何將名為 ButtonClick 的方法繫結至按鈕的 Click 事件。

Dim b As New Button
b.Text = "Click"
AddHandler b.Click, AddressOf ButtonClick
Placeholder1.Controls.Add(b)
Button b = new Button;
b.Text = "Click";
b.Click += new System.EventHandler(ButtonClick);
Placeholder1.Controls.Add(b);

在 ASP.NET 伺服器控制項中回應用戶端和伺服器事件

此主題討論如何處理在伺服端程式碼中引發的事件。控制項將項目呈現給瀏覽器,這些項目也可以引發能在用戶端指令碼中處理的用戶端事件。使用用戶端指令碼,您可以在 ASP.NET 伺服器控制項中加入滑鼠和鍵盤事件處理。如需詳細資訊,請參閱 ASP.NET Web 網頁中的用戶端指令碼HOW TO:將用戶端指令碼事件加入至 ASP.NET Web 伺服器控制項

應用程式和工作階段事件

除了頁面和控制項事件之外,ASP.NET 也為您提供處理在應用程式啟動或停止,或是在個別使用者的工作階段開始或停止時所引發之生命週期事件的方法,包括下列各項:

  • 所有對應用程式的要求都會引發應用程式事件。例如,在要求應用程式中的任何 ASP.NET Web 網頁或 XML Web 服務時,會引發 HttpApplication 物件 (Application_BeginRequest) 的 BeginRequest 事件。這個事件可以讓您初始化將要使用於對應用程式之每一個要求的資源。HttpApplication 物件 (Application_EndRequest) 相對應的 EndRequest 事件,讓您有機會關閉或處置用於要求的資源。

  • 工作階段事件與應用程式事件類似 (有 StartEnd 事件),但這些事件是因應用程式內每個獨特工作階段而引發的。工作階段開始於使用者第一次從應用程式要求網頁時,而當應用程式明確地關閉該工作階段,或該工作階段逾時的時候即告結束。

    注意事項:

    在任何情況下都不會引發 Session_End 事件。如需詳細資訊,請參閱 End

您可以在 Global.asax 檔案中建立這些事件類型的處理常式。如需詳細資訊,請參閱 IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀Global.asax 語法

請參閱

概念

ASP.NET 狀態管理概觀

其他資源

HOW TO:在 ASP.NET Web 網頁中建立事件處理常式

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