中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET中怎么捕獲回傳事件

發布時間:2021-07-15 15:41:09 來源:億速云 閱讀:145 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關ASP.NET中怎么捕獲回傳事件,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1. 實現捕獲回傳事件

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

public interface IPostBackEventHandler  {  void RaisePostBackEvent(string eventArgument);  }

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

public void RaisePostBackEvent(String eventArgument)  {  OnClick(EventArgs.Empty);  }

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

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

第二,為控件分配UniqueID。

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

protected override void Render(HtmlTextWriter output)  {  output.Write("<INPUT TYPE=SUBMIT NAME="< SPAN>);  }

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

第三,實現事件屬性結構。

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

......  public class WebCustomControl:WebControl,IPostBackEventHandler{  //聲明Click事件委托  public event EventHandler Click;   //實現RaisePostBackEvent方法   void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {  OnClick(EventArgs.Empty);  }  //定義OnClick事件處理程序  protected virtual void OnClick(EventArgs e) {  if(Click != null) { Click(this,e); }  }  ......  }

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

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

protected static readonly object EventClick = new object();  public event EventHandler Click{   add {  Events.AddHandler(EventClick,value);  }  remove {   Events.RemoveHandler(EventClick,value);  }  }

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

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

protected virtual void OnClick(EventArgs e){  EventHandler clickHandler = (EventHandler)Events[EventClick];  if(clickHandler != null) {  clickHandler(this,e);  }  }

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

2. 典型應用

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

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

using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Text;  using System.Web;  using System.Web.UI;  using System.Web.UI.WebControls;  namespace WebControlLibrary{ [DefaultEvent("Click")]   [ToolboxData("<{0}:WebCustomControl runat=server>")]   public class WebCustomControl : WebControl, IPostBackEventHandler {   // 定義一個Click事件委托對象    private static readonly object EventClick = new object();    //實現Click事件屬性    [Description("Click事件屬性"), Category("Action") ]    public event EventHandler Click {  add {   Events.AddHandler(EventClick, value);  }  remove {    Events.RemoveHandler(EventClick, value);  }   }      // 重寫控件呈現方法RenderContents    protected override void RenderContents(HtmlTextWriter output) {  output.Write("<INPUT TYPE='SUBMIT' NAME="< SPAN>);    }   //實現事件方法   protected virtual void OnClick(EventArgs e) {  EventHandler clickHandler = (EventHandler)Events[EventClick];   if (clickHandler != null) {   clickHandler(this, e);   }   }   // 實現IPostBackEventHandler接口成員    void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {   OnClick(EventArgs.Empty);   }  }  }

在WebCustomControl類中,實現了以下有關捕獲回傳事件處理的關鍵內容:

·控件類WebCustomControl實現IPostBackEventHandler;

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

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

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

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

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

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

ASP.NET中怎么捕獲回傳事件

圖1 頁面初始化效果圖

ASP.NET中怎么捕獲回傳事件

圖2 點擊按鈕后的效果圖

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

//定義屬性AutoPostBack  public bool AutoPostBack{    set {  this._autoPostBack = value;   }   get {  return this._autoPostBack;   }  }  //在Render方法中添加Page.GetPostBackEventReference()方法  protected override void Render(HtmlTextWriter output){   ......    if(this.AutoPostBack) {   writer.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(this));   }   ......  }

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

以上就是ASP.NET中怎么捕獲回傳事件,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

游戏| 任丘市| 绩溪县| 贺兰县| 石柱| 唐山市| 图们市| 冕宁县| 中方县| 文安县| 襄垣县| 怀安县| 肃宁县| 庄浪县| 娄底市| 志丹县| 柏乡县| 桐柏县| 来宾市| 万荣县| 通榆县| 湘乡市| 长武县| 措勤县| 阿克苏市| 房产| 岐山县| 宕昌县| 会理县| 商水县| 灌云县| 彰化县| 东方市| 桂阳县| 常熟市| 锡林浩特市| 吉水县| 岳普湖县| 济宁市| 长治市| 永嘉县|