天天看點

ASP.NET2.0伺服器控件開發之實作事件

前面幾篇文章講解了與利用 ASP.NET 2.0技術建立自定義伺服器控件屬性有關的内容。從本文開始,包括随後的幾篇文章将探讨建立自定義伺服器控件事件的方法。本文重點對實作控件事件的基本概念進行介紹,這些概念對于幫助開發人員為伺服器控件建立事件有着重要意義。

   1. 事件基本概念

   事件是當有動作發生或者狀态改變時,類發出的資訊或者通知。通常情況下,狀态的發生或者改變由使用者界面動作初始化,例如,單擊按鈕,或者由于其他的程式邏輯引起。産生事件的類或者說發送通知的類叫做事件源sender,接收事件的類叫做事件接收者receiver。二者之間通過委托(delegate)實作關聯。下面列舉了一段常見的應用事件代碼。

// 聲明事件

ClickcustomControl.Click += new EventHandler(this.customControl1_Clicked);

// 實作事件處理程式

customControl1_Clicked(object sender,EventArgs e){......}

  如上代碼列舉了伺服器控件聲明事件和實作事件處理程式的過程。由于這個過程非常簡單,在此将不多做解釋。另外,在實際應用中,開發人員通過為伺服器控件實作事件機制,可以不采用以上的聲明事件方式,而是在控件聲明标記中僅僅列出"OnClick = customControl1_Clicked"即可。實際上,事件的聲明和具體事件處理程式的實作都是比較簡單易用的。然而,為控件實作事件機制卻不是一件容易的事情。

  從伺服器控件開發的角度而言, 控件事件(僅指伺服器端事件,而不包括用戶端事件)可能來自兩個方面:一是從基類繼承的事件。例如,假設自定義控件從Button類繼承,那麼該控件将繼承基類的Click事件。二是根據開發需求而建立的自定義事件。下面分别對這兩種事件進行介紹。

   2. 實作從基類繼承的事件

  衆所周知,自定義伺服器控件歸根結底是從System.Web.UI.Control派生而來。該基類中已經定義了一些事件。是以,在建立伺服器控件過程中,很可能需要重寫以下繼承的多個事件。

  ·DataBinding事件:該事件當伺服器控件綁定到資料源時發生,其對應事件處理程式為OnDataBinding。

  ·Disposed事件:該事件當從記憶體釋放伺服器控件資源時發生,其對應的事件處理程式為OnDisposed。這是伺服器控件生命周期的的最後階段。

  ·Init事件:該事件當伺服器控件初始化時發生,其對應的事件處理程式為OnInit。Init事件是控件生命周期的第一步。

  ·Load事件:該事件當伺服器控件加載到Page對象中時發生,其對應的事件處理程式為OnLoad。

  ·PreRender事件:該事件在加載Control對象之後、呈現之前發生,其對應的事件處理程式為OnPreRender。

  ·Unload事件:該事件當伺服器控件從記憶體中解除安裝時發生,其對應的事件處理程式為OnUnload。

  以上内容針對Control基類的幾個事件進行了簡要說明。由于伺服器控件均繼承自Control基類(WebControl也是繼承自Control類),是以,開發人員完全可以重寫事件所對應的事件處理程式,這樣便可以實作一些自定義内容。

  若要實作自定義繼承的 事件,需要重寫從基類繼承的受保護的OnEventName方法,而不必附加委托(EventHandler)。通常情況下,重寫的事件處理程式應該調用基類的OnEventName方法,以確定調用附加到事件的委托(除非不想調用這些委托)。以下代碼片段說明自定義控件重寫繼承的DataBinding事件的處理過程。

protected override void OnDataBinding(EventArgs e)

{

 //添加一些自定義邏輯代碼

 //調用基類方法

 base.OnDataBinding(e);

}

  如上代碼所示,在重寫事件處理程式OnDataBinding過程中,首先需要添加一些根據應用需求而實作的自定義邏輯代碼,然後,一定要牢記需調用基類方法。

  以上内容對Control基類的事件和派生類重寫對應事件處理程式的過程進行了介紹。需要讀者注意的是,上文并非說明自定義伺服器控件僅能夠重寫以上幾個來自Control基類事件的事件處理程式。如果自定義控件繼承自其他原本帶有事件的基類,例如,Button、DataList等(歸根到底,它們也是從Control基類繼承),那麼繼承的事件處理程式仍然可以被重寫,例如,繼承自Button類的控件自然獲得Click事件,并且可以重寫OnClick事件處理程式。

3. 建立自定義伺服器控件事件

  在介紹建立自定義伺服器控件事件的方法之前,我們首先來簡單回顧一下相關的事件模型。

  在Web窗體頁面中,與伺服器控件關聯的事件由用戶端引發并由Web伺服器處理(注意:事件必須稱為"引發",而不要使用"觸發"和"激發"等詞,它們都是不準确,不規範的)。對于在客戶機上由伺服器控件引發的事件,ASP.NET 2.0事件模型收集有關請求的資訊,并使用HTTP Post将詳細資訊傳遞到伺服器。伺服器上的Page Framework對該公告作出解釋以确定發生的事件,然後,調用适當的處理程式方法。下圖1簡單說明了這一過程。

ASP.NET2.0伺服器控件開發之實作事件
圖1

  如圖1所示,在用戶端計算機中,使用者單擊購物車的Add(添加)按鈕,試圖将所選商品放入購物車中。在單擊之後,事件模型收集了相關資訊,例如,Submit = btnAddToCart,Prod3 = Gizmo等等,将這些資訊通過Post方式傳遞到伺服器。伺服器在接收這些資訊後,首先對其進行分析,然後,調用事件處理程式btnAddToCart(obj,event)進行處理。以上就是基本的事件處理模型。

  對于普通應用程式開發人員而言,隻需要實作控件的事件處理程式即可,更進一步的資訊對于他們而言是隐藏的,而且也是沒有必要作更多關心的。然而,作為伺服器控件開發人員,則必須仔細考慮這一事件處理模型。

  如果讀者仔細思考以上過程,則會發現兩個在事件處理模型中需要解決的重要問題。第一,伺服器端如何捕獲回傳的單擊事件,第二,通過Post方式回傳到伺服器端的資料,具體是如何處理的。以上兩個問題至關重要。如果能夠解決好這兩個問題,那麼建立自定義伺服器控件事件則變得非常容易。

  為了解決以上問題,ASP.NET 2.0提供了兩個重要接口:IPostBackEventHandler和IPostBackDataHandler。IPostBackEventHandler接口用于處理由用戶端引發的頁面回傳的事件。實作此接口,伺服器控件可将用戶端的送出表單事件對應到伺服器端的事件上,并且通過事件處理程式完成對該用戶端事件的處理。IPostBackDataHandler接口用于檢查送出給頁面的資料,并确定是否在用戶端修改過。當控件實作該接口,控件則自動具有了參與回傳資料的處理能力。開發人員可以通過實作接口相關成員,完成針對回傳資料的處理邏輯。

  實際上,ASP.NET 2.0中絕大多數伺服器控件都引發從用戶端到伺服器的回傳,并且讀者實作的很多伺服器控件也必須引發回傳。是以,以上兩個接口對于實作控件事件非常重要。對于它們,本節僅簡單介紹一下。在随後的文章中,讀者将通過典型示例,詳細了解實作接口成員,捕獲回傳事件,處理回傳資料的具體方法。

  另外,ASP.NET 2.0增強了有關回調處理方面的功能。例如,使用System.Web.UI.ICallbackEventHandler接口和Page.GetCallbackEventReference方法等。通過這些對象的應用可實作在用戶端運作伺服器端代碼,進而避免丢失用戶端狀态并且不導緻伺服器往返的處理開銷。這些内容與伺服器控件事件之間有着一些聯系。然而,由于回調應用在伺服器控件中應用較少。是以,将不作過多說明。

   4. 小結

  從技術發展的角度來講,ASP.NET技術從1.x更新到2.0版本,在伺服器控件事件開發方面沒有任何明顯的修改。如果讀者已經了解了ASP.NET 1.x下建立伺服器控件事件的内容,那麼可以按照過去1.x的方法和思路進行開發。下面一篇文章,筆者将通過典型示例介紹伺服器控件捕獲回傳事件的實作方法。

繼續閱讀