ASP.NET2.0服务器控件开发之实现事件

asp.net|服务器|控件|控件开发

  前面几篇文章讲解了与利用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简单说明了这一过程。


图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的方法和思路进行开发。下面一篇文章,笔者将通过典型示例介绍服务器控件捕获回传事件的实现方法。

时间: 2024-09-08 16:40:10

ASP.NET2.0服务器控件开发之实现事件的相关文章

ASP.NET2.0服务器控件之捕获回传事件

asp.net|服务器|控件 1. 实现捕获回传事件       如果服务器控件需要捕获来自客户端的回传事件,并想为该回传事件自定义服务器端事件处理逻辑,那么控件必须实现System.Web.UI.IPostBackEventHandler接口.下面列举了该接口定义.      public interface IPostBackEventHandler   {    void RaisePostBackEvent(string eventArgument);   }       如上代码所示,

ASP.NET2.0 WebRource,开发微调按钮控件

asp.net|web|按钮|控件 现在.有许多开发人员已经在使用ASP.NET2.0的WebResource的功能了.WebResource允许我们嵌入资源到程序集中.包括图像,文本等. 在介绍WebResource就不得不介绍一下WebResource.axd,我们来看一下 script language="javascript"     src="WebResource.axd?a=s&r=WebUIValidation.js&t=63194436284

ASP.NET2.0 WebRource,开发微调按钮控件_实用技巧

现在.有许多开发人员已经在使用ASP.NET2.0的WebResource的功能了.WebResource允许我们嵌入资源到程序集中.包括图像,文本等. 在介绍WebResource就不得不介绍一下WebResource.axd,我们来看一下 script language="javascript"     src="WebResource.axd?a=s&r=WebUIValidation.js&t=631944362841472848"    

ASP.NET2.0服务器控件之Render方法

asp.net|服务器|控件 控件呈现是指向HTTP输出流中写入标记文本的过程.服务器通过HTTP输出流向客户端发送生成的标记文本,这些文本将会通过客户端浏览器转换为可视化的元素显示出来.使用控件呈现,开发人员可以将HTML标记.脚本代码.CSS样式表等等输入到客户端浏览器.实现服务器控件呈现主要有两种方式:一是Control类的Render方法,二是WebControl的RenderContents方法.本文重点介绍使用Control类的Render方法实现控件呈现的应用. 使用HtmlTex

用VS2005实现ASP.NET2.0移动开发

asp.net 即将到来的3G技术,将使得移动设备突破现在的带宽限制,这样我们就可以构建出许多新颖且功能强大的移动应用.现在已经有许多商业应用都开始向移动设备上进行迁移,所以对开发者来说,现在就开始移动开发的学习将是一种非常适合的时机. 在本文中我将介绍如何使用Visual Studio 2005创建一个ASP.NET 2.0移动程序,然后介绍一些常用的移动开发控件并以适合的方式在程序中加于应用,最后将谈谈如何开发针对特定移动设备的WEB程序和管理程序中的ViewState(视图状态)和Sess

ASP.NET2.0服务器控件之创建自定义控件

asp.net|创建|服务器|控件 摘要 本文将详细讲解一个简单的自定义服务器控件的创建过程.通过这些内容,读者将了解利用Visual Studio 2005,创建和测试自定义服务器控件的基本方法. 注意:本文内容基于ASP.NET 2.0技术撰写,示例应用程序使用Visual Studio 2005进行开发. 创建一个简单的自定义服务器控件 创建自定义服务器控件的过程包括: (1)创建一个测试用Web站点应用程序: (2)为新建站点应用程序,新增一个Web控件库项目: (3)编写.编译和测试自

ASP.NET2.0服务器控件之创建复杂属性

asp.net|创建|服务器|控件 上一篇文章介绍了实现3种形式复杂属性的具体方法.为了加深读者对于这些实现方法的理解深度,本文详细讲解了一个利用ASP.NET 2.0技术创建复杂属性的示例. 1. 示例应用 本文所实现的示例很简单,其核心是通过实现自定义服务器控件的连字符形式复杂属性来说明复杂属性的实现方法,其中使用了上一篇文章中介绍的内容.示例效果图如图1所示. 图1 如图1所示,页面显示了公司所在城市.姓名.性别和职务信息.这些内容是定义服务器控件呈现的结果,其中公司所在城市由简单属性Ci

ASP.NET2.0服务器控件之自定义状态管理

asp.net|服务器|控件 在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性.本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法. 自定义视图状态管理 在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String.Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能.然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化

ASP.NET2.0服务器控件之类型化样式属性

asp.net|服务器|控件 上一篇文章对控件样式属性的基本概念进行了介绍,同时,还通过示例说明了重写样式属性的方法.本文重点对类型化样式属性的创建方法进行讲解. 实现类型化样式属性的方法 继承自Style类的类称为类型化样式.Style类可以由控件开发人员来扩展,创建一个自定义类型化样式,它重写或者添加Style类的属性.服务器控件也可以把自定义类型化样式作为ControlStyle属性的类型.例如,Table控件的ControlStyle属性就是TableStyle类型,该类型是扩展的Sty