ASP.NET服务器控件之捕获回传事件浅析

ASP.NET服务器控件之捕获回传事件的缘由:

网站设计制作过程拒绝使用模板建站;使用PHP+MYSQL原生开发可交付网站源代码;符合网站优化排名的后台管理系统;网站制作、网站设计收费合理;免费进行网站备案等企业网站建设一条龙服务.我们是一家持续稳定运营了10年的创新互联公司网站建设公司。

前面介绍了实现自定义ASP.NET服务器控件事件的基本概念。本文将通过典型示例讲解捕获回传事件的实现方法。

1. 实现捕获回传事件

如果ASP.NET服务器控件需要捕获来自客户端的回传事件,并想为该回传事件自定义服务器端事件处理逻辑,那么控件必须实现System.Web.UI.IPostBackEventHandler接口。下面列举了该接口定义。

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

如上代码所示,IPostBackEventHandler接口仅包括一个成员方法RaisePostBackEvent。该方法使ASP.NET服务器控件能够处理将窗体发送到服务器时引发的事件,其参数eventArgument表示要传递到事件处理程序的可选事件参数。开发人员可以在RaisePostBackEvent方法中实现ASP.NET服务器控件回传过程中执行的逻辑。一般情况下,RaisePostBackEvent方法将引发一个或者多个服务器端事件。以下代码片段显示了在服务器上引发Click事件的RaisePostBackEvent实现。

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

实现捕获回传事件并不是仅仅使ASP.NET服务器控件类实现IPostBackEventHandler接口,并实现该接口成员方法就可以的。开发人员还需要注意实现其他内容。下面列举了实现捕获回传事件过程中的三个要点。

***,也是最重要的,即自定义ASP.NET服务器控件类必须实现IPostBackEventHandler接口,并实现该接口成员RaisePostBackEvent方法。这一过程在上文中已经进行了介绍。

第二,为控件分配UniqueID。

定义引起回传事件的控件的name属性值为UniqueID,是正确实现RaisePostBackEvent方法的关键之一。当引发回传后,页框架就会搜索发送的内容,并确定发送对象的名称是否与实现IPostBackEventHandler的ASP.NET服务器控件的UniqueID对应。如果对应,页框架就会在该控件上调用RaisePostBackEvent方法。这里的重点是需要开发人员在呈现逻辑中,为控件的name属性分配UniqueID。下面列举了一个简单的代码示例。

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

如上代码所示,在控件呈现方法Render中,呈现了一个按钮,其name属性值为UniqueID。只有为引起回传的控件的name属性分配了UniqueID,才能够正确实现捕获回传事件。

第三,实现事件属性结构。

事件属性结构是一种优化的事件实现方式。在介绍之前,我们首先看看常见的控件事件实现方式。具体代码如下所示。

 
 
 
 
  1. ......
  2. public class WebCustomControl:WebControl,IPostBackEventHandler{
  3. //声明Click事件委托
  4. public event EventHandler Click; 
  5. //实现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. ......

在以上代码中,包括了与事件定义相关的三个关键内容:一、定义Click事件委托;二、控件类实现了IPostBackEventHandler接口,其中当实现接口成员方法RaisePostBackEvent过程中,定义了事件处理程序OnClick;三、实现OnClick事件处理程序。以上实现方法简单易用,然而却存在一个缺点,即执行效率低。尤其是在一个类中引发多个事件的情况下,将会增加开销,浪费大量服务器资源,最终导致运行效率降低。

为了解决以上问题,下面介绍一种优化的事件实现方式--事件属性结构。该结构使用System.ComponentModel.EventHandlerList类,这个类提供一个简单的委托列表。通过使用该类所提供的相关方法,开发人员能够灵活的操作控件的事件处理程序委托列表。例如,控件中的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事件委托对象。由于每个事件仅创建一次,因此,需要声明为静态和只读的。然后,在属性结构中通过AddHandler、RemoveHandler方法操作事件处理程序委托列表。当页面调用Click事件时,它向控件的EventHandlerList集合中添加或者删除处理程序。由于这种实现方法,在多个事件的声明过程中比普通的实现方法效率高,因此是非常值得推荐的方法。

另外,在OnClick方法的实现过程中,当用一个事件属性时,必须从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. 典型应用

实事求是的讲,以上捕获回传事件的理论介绍对于从未实现过ASP.NET服务器控件事件的读者而言,有些难以理解。为此,本小节通过一个典型的示例来具体说明捕获回传事件的实现方法。

本例实现了一个自定义ASP.NET服务器控件WebCustomControl。该控件虽然呈现为一个按钮外观,但是其并不是从Button类继承而来。当单击该按钮时,控件将引起回传,服务器端自动捕获回传的单击事件,并且引发Click事件,执行对应事件处理程序。下面是ASP.NET服务器控件实现的源代码代码:

 
 
 
 
  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.  //实现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.  // 重写控件呈现方法RenderContents
  25.  protected override void RenderContents(HtmlTextWriter output) {
  26. output.Write(" );   
  27.  }
  28.  //实现事件方法
  29.  protected virtual void OnClick(EventArgs e) {
  30. EventHandler clickHandler = (EventHandler)Events[EventClick]; 
  31. if (clickHandler != null) {
  32.  clickHandler(this, e); 
  33. }
  34.  }
  35.  // 实现IPostBackEventHandler接口成员 
  36.  void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { 
  37. OnClick(EventArgs.Empty);
  38.  }
  39. }

在WebCustomControl类中,实现了以下有关捕获回传事件处理的关键内容:

·控件类WebCustomControl实现IPostBackEventHandler;

·将引发回传的控件的name属性值设置UniqueID;

·实现事件属性结构,维护事件处理程序委托列表;

·在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。该属性用于控件的自动回传设置,很多标准的服务器控件中均包含该属性。对于开发人员来讲,是否需要在自行创建的ASP.NET服务器控件中定义该属性是很重要的,需要根据控件的功能需求认真考虑取舍。该属性的关键代码实现如下:

 
 
 
 
  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属性的实现重点是Page.GetPostBackEventReference方法的应用。该方法获取对客户端脚本函数的引用,调用该函数将使服务器发送回该页,并返回一段表示客户端事件的字符串,实际是一些客户端代码。当AutoPostBack="true"时,ASP.NET服务器控件将发生自动回传,而不需通过Click事件等引发;当AutoPostBack="false",则回传必须经过类似Click的事件引发。

以上介绍的是有关捕获回传事件的具体实现方法。总体来讲不是非常复杂,然而,实现捕获回传事件的具体应用非常灵活,远远没有这么简单,这就需要读者不断的实践才能深入理解。

3. 小结

本文首先介绍了利用ASP.NET技术,为自定义ASP.NET服务器控件实现捕获回传事件的实现方法。通过这些内容,相信读者可以基本掌握实现控件捕获回传事件的方法。在随后的文章中,笔者将继续介绍实现事件处理的另一核心内容--处理回传数据。

网站名称:ASP.NET服务器控件之捕获回传事件浅析
网址分享:http://www.shufengxianlan.com/qtweb/news34/269634.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联