(二)、事件和数据回发机制

  1. 控件事件和数据回发概述
  • 深层了解一下Button 的事件:

假如我们没有对Button 注册Click 事件,则Button 会执行一遍它内部的Click 相关逻辑,并没有对Page 对象产生任何影响;如果我们为Button 定义了Click 事件(如上面代码片段),则Button 还是执行一遍它内部的Click 相关逻辑,不同的是在执行自己内部逻辑的过程中它还执行了Page 对象中的一些代码功(即Button 的事件体Button1_Click 方法),就达到了我们要实现的功能。通过触动一个对象Button 影响到另一个对象Page 的行为, 并且在Button 的事件体中即可以修改Button 本身( 通过sender 或this.Button1),也可以修改Page 页面对象的其他控件或执行任意想要的代码功能。其次从ASP.NET 工作机制说一下它的工作原理,与桌面应用程序中的事件不同,ASP.NET服务器控件事件是在服务器上引发和处理的。当Web 请求将客户端操作发送到服务器时,控件可以在服务器上引发事件来响应客户端操作。该页或其子控件对事件进行处理,然后ASP.NET 将响应发送回客户端。这样,用户感觉就像在使用桌面应用程序一样。但是,控件开发人员必须了解只有一个客户端事件发送到服务器,即回发事件。

  • 数据回发机制

两次页面请求之间的数据关联性问题,ASP.NET 是通过视图机制实现的。简单地讲, 视图区域信息( ViewState)存储在页面上的一个隐藏字段,里面存储每次需要视图机制保存的一些信息,每次提交时,它都会以“客户端到􀃙服务端”的形式来回传递一次,当处理完成后,最后会以处理后的新结果作为新的视图信息存储到页面中的隐藏字段,并与页面内容一起返回到客户端。后面会有针对视图状态机制的专门讲解,这里仅了解其功能即可。有了视图机制,在其基础之上的数据回发机制就是完成处理视图信息的功能。具体过程是,服务端控件只要实现IPostBackDataHandler 接口,则当客户端提交请求后,就会有机会利

用IPostBackDataHandler 接口的LoadPostData 方法,在该方法内部处理子控件的新旧值逻辑,而视图信息数据这时以一个集合对象形式作为LoadPostData 参数,并可以决定是否引发控件值变化后的事件。这就是要引入数据回发机制功能的原因。

  1. 事件和数据回发机制的实现
  • 客户端回传事件接口IPostBackEventHandler

public interface IPostBackEventHandler

{

void RaisePostBackEvent(string eventArgument);

}

下面通过一个简单的完整例子,了解事件回发处理机制
 

 

控件能够捕捉处理该事件需要具备两个条件:第一, 主控件继承了

IPostBackEventHandler 接口以及实现了RaisePostBackEvent 方法;第二,必须有name 值为

UniqueID 的客户端标签,页框架只认识控件的name 属性。只有这两个条件同时具备才能够

使控件具备捕捉并处理事件的机会

  • 客户端回发/回调揭密

使用方法GetPostBackEventReference 得到回发脚本

ASP.NET 提供了Page.ClientScript.GetPostBackEventReference 方法。ClientScript 类型为ClientScriptManager,该类主要功能是在Web 应用程序中定义用于管理客户端脚本的方法。GetPostBackEventReference 方法体结构如下:GetCallbackEventReference(String, String, String, String, String, Boolean此方法功能是获取一个对客户端函数的引用;调用该方法时,将启动一个对服务器事件的客户端回调。此重载方法的客户端函数包含指定的目标、参数、客户端脚本、上下文、错误处理程序和布尔值。在期望不执行回发而从客户端运行服务器代码的情况下,可以使用ClientScriptManager类来调用客户端回调。这称为对服务器执行带外回调。在客户端回调中,客户端脚本函数向ASP.NET 网页发送异步请求。网页修改其正常生命周期来处理回调。使用GetCallbackEvent

Reference 方法获取一个对客户端函数的引用,当调用该函数时,它将启动一个对服务器端事件的客户端回调。

另外, Page.ClientScript 对象还有个非常重要的方法GetCallback EventReference。使用GetCallbackEventReference 方法获取一个对客户端函数的引用,当调用该函数时,它将启动一个对服务器端事件的客户端回调,可以支持设置客户端回调方法名称等

  • 回传数据处理接口IPostBackDataHandler

数据回发和回传事件

IPostBackDataHandler 接口用于检查提交给页面的数据,并确定数据是否在客户端修改过。当控件实现该接口,控件则自动具有了参与回传数据的处理能力。开发人员可以通过实现接口相关成员,完成针对回传数据的处理逻辑。

数据回发处理和数据回发事件就讲这些,最后再总结一下其要点步骤:

  • 设置主控件的name 值为UniqueID。
  • 实现LoadPostData 方法,处理自己的数据比较逻辑,返回布尔值。
  • 实现RaisePostDataChangedEvent,在该方法加入自定义事件。如上面的OnTextValueChanged(EventArgs.Empty)。
  • 如果LoadPostData 方法返回true,页框架会自动调用RaisePostDataChangedEvent 方法。
  • 把控件注册为要进行回发处理的控件

TextBox tb = new TextBox();

protected void Page_PreRender(object sender, EventArgs e)

{

this.Page.RegisterRequiresPostBack(tb);

}

  • 典型数据回发,事件回发实例:

 

3。 复合控件的事件处理机制

  • 高效率事件集合对象

在复合控件中,事件一般比较多,如果仍然基于以上普通事件的实现方法来定义事件,就会定义许多事件委托实现对象,导致占用较多内存存储。

在这种情况下,则应该通过System.Co mponentModel.EventHandlerList 集合类来保存事件,原因是使用此类在多个事件的声明过程中比普通的实现方法效率高。EventHandlerList 类提供一个简单的委托列表来添加( Events.AddHandler)和删除(Events.RemoveHandler)委托,在Control 基类中已经定义好了EventHandlerList 类型的对象Events ,因此可以直接通过base.Events 访问事件列表对象。

  • 定制自己的委托和事件参数类:通过PageIndexChanged说明
  • 复合控件的事件处理

复合控件的事件处理按实现功能可分为三种:

(1)复合控件中子控件的内部事件处理。

(2)包含处理机制—子控件事件中调用主控件委托的事件实例。

(3)冒泡处理机制。:

冒泡法的实现,主要是利用Control 基类中专门用于事件上传的两个方法OnBubbleEvent

和RaiseBubbleEvent。

posted @ 2010-09-15 14:58  kntao  阅读(355)  评论(0)    收藏  举报