成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET服務(wù)器控件之捕獲回傳事件淺析

開(kāi)發(fā) 后端
ASP.NET服務(wù)器控件之捕獲回傳事件主要向你講述在實(shí)現(xiàn)自定義服務(wù)器控件事件之后如何捕獲回傳事件的實(shí)現(xiàn)方法。

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

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

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

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

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

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

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

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

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

第二,為控件分配UniqueID。

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

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

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

第三,實(shí)現(xiàn)事件屬性結(jié)構(gòu)。

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

  1. ......  
  2. public class WebCustomControl:WebControl,IPostBackEventHandler{  
  3. //聲明Click事件委托  
  4. public event EventHandler Click;   
  5. //實(shí)現(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. ......  
  14. }  

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

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

  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. }  
  9. }  

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

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

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

請(qǐng)讀者注意:事件屬性結(jié)構(gòu)不適用于VB.NET語(yǔ)言,只能在C#等語(yǔ)言中應(yīng)用。

2. 典型應(yīng)用

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

本例實(shí)現(xiàn)了一個(gè)自定義ASP.NET服務(wù)器控件WebCustomControl。該控件雖然呈現(xiàn)為一個(gè)按鈕外觀,但是其并不是從Button類繼承而來(lái)。當(dāng)單擊該按鈕時(shí),控件將引起回傳,服務(wù)器端自動(dòng)捕獲回傳的單擊事件,并且引發(fā)Click事件,執(zhí)行對(duì)應(yīng)事件處理程序。下面是ASP.NET服務(wù)器控件實(shí)現(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.  // 定義一個(gè)Click事件委托對(duì)象   
  12.  private static readonly object EventClick = new object();   
  13.  //實(shí)現(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.  
  26.  protected override void RenderContents(HtmlTextWriter output) {  
  27. output.Write(");   
  28.  }  
  29.  //實(shí)現(xiàn)事件方法  
  30.  protected virtual void OnClick(EventArgs e) {  
  31. EventHandler clickHandler = (EventHandler)Events[EventClick];   
  32. if (clickHandler != null) {  
  33.  clickHandler(this, e);   
  34. }  
  35.  }  
  36.  // 實(shí)現(xiàn)IPostBackEventHandler接口成員   
  37.  void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {   
  38. OnClick(EventArgs.Empty);  
  39.  }  
  40. }  
  41. }  

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

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

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

·實(shí)現(xiàn)事件屬性結(jié)構(gòu),維護(hù)事件處理程序委托列表;

·在RaisePostBackEvent方法中調(diào)用OnClick方法;

下面的代碼是應(yīng)用自定義按鈕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 = "您剛才點(diǎn)擊了上面的按鈕";   
  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是應(yīng)用效果圖。

頁(yè)面初始化效果圖 

圖1 頁(yè)面初始化效果圖

點(diǎn)擊按鈕后的效果圖 

圖2 點(diǎn)擊按鈕后的效果圖

另外,還有一個(gè)與捕獲回傳事件密切相關(guān)的屬性AutoPostBack。該屬性用于控件的自動(dòng)回傳設(shè)置,很多標(biāo)準(zhǔn)的服務(wù)器控件中均包含該屬性。對(duì)于開(kāi)發(fā)人員來(lái)講,是否需要在自行創(chuàng)建的ASP.NET服務(wù)器控件中定義該屬性是很重要的,需要根據(jù)控件的功能需求認(rèn)真考慮取舍。該屬性的關(guān)鍵代碼實(shí)現(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.  ......  
  17. }  

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

以上介紹的是有關(guān)捕獲回傳事件的具體實(shí)現(xiàn)方法。總體來(lái)講不是非常復(fù)雜,然而,實(shí)現(xiàn)捕獲回傳事件的具體應(yīng)用非常靈活,遠(yuǎn)遠(yuǎn)沒(méi)有這么簡(jiǎn)單,這就需要讀者不斷的實(shí)踐才能深入理解。

3. 小結(jié)

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

【編輯推薦】

  1. ASP.NET控件開(kāi)發(fā)技巧之ComboBox顯示淺析
  2. ASP.NET控件開(kāi)發(fā)基礎(chǔ)之自定義控件淺析
  3. ASP.NET服務(wù)器控件Render方法的使用淺析
  4. ASP.NET服務(wù)器控件開(kāi)發(fā)之實(shí)現(xiàn)事件淺析
  5. ASP.NET服務(wù)器控件之處理回傳數(shù)據(jù)淺析
責(zé)任編輯:仲衡 來(lái)源: 天極開(kāi)發(fā)
相關(guān)推薦

2009-08-06 11:05:48

ASP.NET服務(wù)器控

2009-08-03 18:00:00

ASP.NET服務(wù)器控

2009-08-10 14:25:33

ASP.NET服務(wù)器控

2009-08-06 10:49:45

ASP.NET服務(wù)器控

2009-08-05 17:11:51

ASP.NET控件開(kāi)發(fā)ASP.NET服務(wù)器控

2009-07-28 09:46:53

ASP.NET服務(wù)器控

2009-08-10 14:08:15

ASP.NET服務(wù)器控ASP.NET組件設(shè)計(jì)

2009-08-07 17:49:44

控件設(shè)計(jì)器

2009-08-06 14:16:04

ASP.NET服務(wù)器控

2009-08-06 10:10:31

ASP.NET服務(wù)器控ASP.NET Ren

2009-08-04 13:10:05

ASP.NET服務(wù)器控

2009-08-06 14:42:54

ASP.NET服務(wù)器控

2011-07-12 15:03:28

2009-07-27 17:25:53

ASP.NET驗(yàn)證控件

2009-08-03 15:43:22

asp.net控件

2009-07-28 16:21:03

Asp.net AjaAutoComplet

2009-08-04 17:18:37

2011-07-12 15:17:02

ASP.net服務(wù)器控件

2009-08-06 13:08:23

ASP.NET控件開(kāi)發(fā)

2009-08-06 15:21:45

ASP.NET控件開(kāi)發(fā)RenderConte
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 二区中文 | 久久久久国产一区二区三区四区 | 黄网站在线播放 | 日本一区二区高清视频 | 久久久.com | 超碰高清| 国产男女视频 | 欧美激情精品久久久久 | 国产精品视频播放 | 欧美日韩在线精品 | 麻豆视频国产在线观看 | 成人国产精品久久 | 日韩毛片在线观看 | 欧美精品久久久久 | 久久精品二区亚洲w码 | 一区二区av| 男女视频免费 | 精品久久久久久亚洲综合网 | 国产亚韩 | 国产日本精品视频 | 超碰97人人人人人蜜桃 | 日日夜夜视频 | 男女免费在线观看视频 | 中文字幕日本一区二区 | 91精品国产99久久 | 日韩电影在线 | 黄在线免费观看 | 色男人的天堂 | 丁香久久 | 成人一区精品 | 在线观看免费av网站 | 97国产精品视频 | 免费色网址 | 成人精品视频在线观看 | 日韩精品在线一区 | 亚州春色 | 中文字幕精品一区二区三区在线 | 国产xxxx搡xxxxx搡麻豆 | 国产精品一区二区久久 | 久久久精品一区二区 | 国产精品久久久久久久久久久久 |