日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ASP.NET服務器控件之捕獲回傳事件淺析

ASP.NET服務器控件之捕獲回傳事件的緣由:

網(wǎng)站設計制作過程拒絕使用模板建站;使用PHP+MYSQL原生開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺管理系統(tǒng);網(wǎng)站制作、網(wǎng)站設計收費合理;免費進行網(wǎng)站備案等企業(yè)網(wǎng)站建設一條龍服務.我們是一家持續(xù)穩(wěn)定運營了10年的創(chuàng)新互聯(lián)公司網(wǎng)站建設公司。

前面介紹了實現(xiàn)自定義ASP.NET服務器控件事件的基本概念。本文將通過典型示例講解捕獲回傳事件的實現(xiàn)方法。

1. 實現(xiàn)捕獲回傳事件

如果ASP.NET服務器控件需要捕獲來自客戶端的回傳事件,并想為該回傳事件自定義服務器端事件處理邏輯,那么控件必須實現(xiàn)System.Web.UI.IPostBackEventHandler接口。下面列舉了該接口定義。

 
 
 
 
  1. public interface IPostBackEventHandler
  2. {
  3. void RaisePostBackEvent(string eventArgument);

如上代碼所示,IPostBackEventHandler接口僅包括一個成員方法RaisePostBackEvent。該方法使ASP.NET服務器控件能夠處理將窗體發(fā)送到服務器時引發(fā)的事件,其參數(shù)eventArgument表示要傳遞到事件處理程序的可選事件參數(shù)。開發(fā)人員可以在RaisePostBackEvent方法中實現(xiàn)ASP.NET服務器控件回傳過程中執(zhí)行的邏輯。一般情況下,RaisePostBackEvent方法將引發(fā)一個或者多個服務器端事件。以下代碼片段顯示了在服務器上引發(fā)Click事件的RaisePostBackEvent實現(xiàn)。

 
 
 
 
  1. public void RaisePostBackEvent(String eventArgument)
  2. {
  3. OnClick(EventArgs.Empty);

實現(xiàn)捕獲回傳事件并不是僅僅使ASP.NET服務器控件類實現(xiàn)IPostBackEventHandler接口,并實現(xiàn)該接口成員方法就可以的。開發(fā)人員還需要注意實現(xiàn)其他內(nèi)容。下面列舉了實現(xiàn)捕獲回傳事件過程中的三個要點。

***,也是最重要的,即自定義ASP.NET服務器控件類必須實現(xiàn)IPostBackEventHandler接口,并實現(xiàn)該接口成員RaisePostBackEvent方法。這一過程在上文中已經(jīng)進行了介紹。

第二,為控件分配UniqueID。

定義引起回傳事件的控件的name屬性值為UniqueID,是正確實現(xiàn)RaisePostBackEvent方法的關鍵之一。當引發(fā)回傳后,頁框架就會搜索發(fā)送的內(nèi)容,并確定發(fā)送對象的名稱是否與實現(xiàn)IPostBackEventHandler的ASP.NET服務器控件的UniqueID對應。如果對應,頁框架就會在該控件上調用RaisePostBackEvent方法。這里的重點是需要開發(fā)人員在呈現(xiàn)邏輯中,為控件的name屬性分配UniqueID。下面列舉了一個簡單的代碼示例。

 
 
 
 
  1. protected override void Render(HtmlTextWriter output)
  2. {
  3. output.Write(" );  

如上代碼所示,在控件呈現(xiàn)方法Render中,呈現(xiàn)了一個按鈕,其name屬性值為UniqueID。只有為引起回傳的控件的name屬性分配了UniqueID,才能夠正確實現(xiàn)捕獲回傳事件。

第三,實現(xiàn)事件屬性結構。

事件屬性結構是一種優(yōu)化的事件實現(xiàn)方式。在介紹之前,我們首先看看常見的控件事件實現(xiàn)方式。具體代碼如下所示。

 
 
 
 
  1. ......
  2. public class WebCustomControl:WebControl,IPostBackEventHandler{
  3. //聲明Click事件委托
  4. public event EventHandler Click; 
  5. //實現(xiàn)RaisePostBackEvent方法 
  6. void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
  7. OnClick(EventArgs.Empty);
  8. }
  9. //定義OnClick事件處理程序
  10. protected virtual void OnClick(EventArgs e) {
  11. if(Click != null) { Click(this,e); }
  12. }
  13. ......

在以上代碼中,包括了與事件定義相關的三個關鍵內(nèi)容:一、定義Click事件委托;二、控件類實現(xiàn)了IPostBackEventHandler接口,其中當實現(xiàn)接口成員方法RaisePostBackEvent過程中,定義了事件處理程序OnClick;三、實現(xiàn)OnClick事件處理程序。以上實現(xiàn)方法簡單易用,然而卻存在一個缺點,即執(zhí)行效率低。尤其是在一個類中引發(fā)多個事件的情況下,將會增加開銷,浪費大量服務器資源,最終導致運行效率降低。

為了解決以上問題,下面介紹一種優(yōu)化的事件實現(xiàn)方式--事件屬性結構。該結構使用System.ComponentModel.EventHandlerList類,這個類提供一個簡單的委托列表。通過使用該類所提供的相關方法,開發(fā)人員能夠靈活的操作控件的事件處理程序委托列表。例如,控件中的Click事件,使用事件屬性結構如下:

 
 
 
 
  1. protected static readonly object EventClick = new object();
  2. public event EventHandler Click{ 
  3. add {
  4. Events.AddHandler(EventClick,value);
  5. }
  6. remove { 
  7. Events.RemoveHandler(EventClick,value);
  8. }

在事件屬性結構定義之前,首先需要定義Click事件委托對象。由于每個事件僅創(chuàng)建一次,因此,需要聲明為靜態(tài)和只讀的。然后,在屬性結構中通過AddHandler、RemoveHandler方法操作事件處理程序委托列表。當頁面調用Click事件時,它向控件的EventHandlerList集合中添加或者刪除處理程序。由于這種實現(xiàn)方法,在多個事件的聲明過程中比普通的實現(xiàn)方法效率高,因此是非常值得推薦的方法。

另外,在OnClick方法的實現(xiàn)過程中,當用一個事件屬性時,必須從EventHandlerList中取回委托,并將其轉換成EventHandler的類型。

 
 
 
 
  1. protected virtual void OnClick(EventArgs e){
  2. EventHandler clickHandler = (EventHandler)Events[EventClick];
  3. if(clickHandler != null) {
  4. clickHandler(this,e);
  5. }
  6. }

請讀者注意:事件屬性結構不適用于VB.NET語言,只能在C#等語言中應用。

2. 典型應用

實事求是的講,以上捕獲回傳事件的理論介紹對于從未實現(xiàn)過ASP.NET服務器控件事件的讀者而言,有些難以理解。為此,本小節(jié)通過一個典型的示例來具體說明捕獲回傳事件的實現(xiàn)方法。

本例實現(xiàn)了一個自定義ASP.NET服務器控件WebCustomControl。該控件雖然呈現(xiàn)為一個按鈕外觀,但是其并不是從Button類繼承而來。當單擊該按鈕時,控件將引起回傳,服務器端自動捕獲回傳的單擊事件,并且引發(fā)Click事件,執(zhí)行對應事件處理程序。下面是ASP.NET服務器控件實現(xiàn)的源代碼代碼:

 
 
 
 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Text;
  5. using System.Web;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. namespace WebControlLibrary{ [DefaultEvent("Click")] 
  9. [ToolboxData("<{0}:WebCustomControl runat=server>")] 
  10. public class WebCustomControl : WebControl, IPostBackEventHandler {
  11.  // 定義一個Click事件委托對象 
  12.  private static readonly object EventClick = new object(); 
  13.  //實現(xiàn)Click事件屬性 
  14.  [Description("Click事件屬性"), Category("Action") ] 
  15.  public event EventHandler Click {
  16. add {
  17.  Events.AddHandler(EventClick, value);
  18. }
  19. remove { 
  20.  Events.RemoveHandler(EventClick, value);
  21. }
  22.  }
  23.  
  24.  // 重寫控件呈現(xiàn)方法RenderContents
  25.  protected override void RenderContents(HtmlTextWriter output) {
  26. output.Write(" );   
  27.  }
  28.  //實現(xiàn)事件方法
  29.  protected virtual void OnClick(EventArgs e) {
  30. EventHandler clickHandler = (EventHandler)Events[EventClick]; 
  31. if (clickHandler != null) {
  32.  clickHandler(this, e); 
  33. }
  34.  }
  35.  // 實現(xiàn)IPostBackEventHandler接口成員 
  36.  void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { 
  37. OnClick(EventArgs.Empty);
  38.  }
  39. }

在WebCustomControl類中,實現(xiàn)了以下有關捕獲回傳事件處理的關鍵內(nèi)容:

·控件類WebCustomControl實現(xiàn)IPostBackEventHandler;

·將引發(fā)回傳的控件的name屬性值設置UniqueID;

·實現(xiàn)事件屬性結構,維護事件處理程序委托列表;

·在RaisePostBackEvent方法中調用OnClick方法;

下面的代碼是應用自定義按鈕WebCustomControl的Default.aspx源代碼,顯示效果如圖1和圖2所示。

 
 
 
 
  1. ﹤%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %﹥
  2. ﹤%@ Register TagPrefix="cc" Namespace="WebControlLibrary" Assembly="WebControlLibrary" %﹥
  3. ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  4. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥
  5. ﹤script runat="server"﹥ 
  6.  void wcc1_Click(object sender, EventArgs e) {
  7. message.Text = "您剛才點擊了上面的按鈕"; 
  8.  }
  9. ﹤/script﹥
  10. ﹤html xmlns="http://www.w3.org/1999/xhtml"﹥
  11. ﹤head runat="server"﹥
  12. ﹤title﹥捕獲回傳事件﹤/title﹥
  13. ﹤/head﹥
  14. ﹤body﹥
  15.  ﹤form id="form1" runat="server"﹥ 
  16.  ﹤center﹥ 
  17. ﹤cc:WebCustomControl ID="wcc1" runat="server" OnClick="wcc1_Click" /﹥ ﹤br /﹥ ﹤br /﹥
  18. ﹤asp:Label ID="message" runat="server"﹥﹤/asp:Label﹥
  19.  ﹤/center﹥
  20. ﹤/form﹥
  21. ﹤/body﹥
  22. ﹤/html﹥ 

下圖1和圖2是應用效果圖。

圖1 頁面初始化效果圖

圖2 點擊按鈕后的效果圖

另外,還有一個與捕獲回傳事件密切相關的屬性AutoPostBack。該屬性用于控件的自動回傳設置,很多標準的服務器控件中均包含該屬性。對于開發(fā)人員來講,是否需要在自行創(chuàng)建的ASP.NET服務器控件中定義該屬性是很重要的,需要根據(jù)控件的功能需求認真考慮取舍。該屬性的關鍵代碼實現(xiàn)如下:

 
 
 
 
  1. //定義屬性AutoPostBack
  2. public bool AutoPostBack{ 
  3.  set {
  4. this._autoPostBack = value;
  5.  }
  6.  get {
  7. return this._autoPostBack;
  8.  }
  9. }
  10. //在Render方法中添加Page.GetPostBackEventReference()方法
  11. protected override void Render(HtmlTextWriter output){
  12.  ...... 
  13.  if(this.AutoPostBack) { 
  14. writer.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(this));
  15.  }
  16.  ......

由以上代碼可知,AutoPostBack屬性的實現(xiàn)重點是Page.GetPostBackEventReference方法的應用。該方法獲取對客戶端腳本函數(shù)的引用,調用該函數(shù)將使服務器發(fā)送回該頁,并返回一段表示客戶端事件的字符串,實際是一些客戶端代碼。當AutoPostBack="true"時,ASP.NET服務器控件將發(fā)生自動回傳,而不需通過Click事件等引發(fā);當AutoPostBack="false",則回傳必須經(jīng)過類似Click的事件引發(fā)。

以上介紹的是有關捕獲回傳事件的具體實現(xiàn)方法。總體來講不是非常復雜,然而,實現(xiàn)捕獲回傳事件的具體應用非常靈活,遠遠沒有這么簡單,這就需要讀者不斷的實踐才能深入理解。

3. 小結

本文首先介紹了利用ASP.NET技術,為自定義ASP.NET服務器控件實現(xiàn)捕獲回傳事件的實現(xiàn)方法。通過這些內(nèi)容,相信讀者可以基本掌握實現(xiàn)控件捕獲回傳事件的方法。在隨后的文章中,筆者將繼續(xù)介紹實現(xiàn)事件處理的另一核心內(nèi)容--處理回傳數(shù)據(jù)。


分享名稱:ASP.NET服務器控件之捕獲回傳事件淺析
URL標題:http://www.dlmjj.cn/article/dhegohp.html