Welcome 微信登录

首页 / 网页编程 / ASP.NET / ASP.NET服务器控件封装-【事件】-1.1【事件回发.异步回调】

ASP.NET服务器控件封装-【事件】-1.1【事件回发.异步回调】2011-08-28 博客园 杨平最近,正在学习ASP.NET服务器控件封装相关的知识,把自己学到的和大家分 享下。

本次内容的概要如下:

1.事件以及为什么需要事件驱动机制;

2.回发的原理;

3.异步回调的原理;

4.事件回发的实现;

5.异步回调的实现。

了解了本次内容的概要,接下来就分节次说明了。

1.事件以及为什么需要事件驱动机制

在C#语言详解一书中对事件的定义是“事件是一种使对象或类能够提供通知的 成员”,在这里换句话 说就是页面中已注册事件的对象能够对用户的操作进行捕获并处理。那么为什么 需要引用事件机制呢?

大家都知道,如果在类A的实例对象中创建了一个类B的实例对象,那么在类A 的实例对象中就可以通 过该类B的实例对象调用类B公开的任何方法和属性等。就像用户Page对象中包含 了创建了一个TextBox对 象,Page对象就可以通过TextBox对象去调用Text属性。但是如果需要在上述的 TextBox对象中调用Page 对象中的某些属性或方法又该怎样处理呢?显然包含调用就行不通了,事件机制 正好解决该问题。

现就TextBox的TextChanged事件来描述下。

首先需要在TextBox中声明TextChanged委托,并通过页面注册将该委托和页面 类处理事件函数关联起 来

<asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>

(上述代码就是将TextBox1的TextChanged事件注册到页面类中)。

然后在TextBox类体内调用TextChanged委托关联的事件函数就可以了。这样, 当页面类对象中 TextBox控件的Text发生改变时TextBox首先执行完自己内部逻辑处理后,就会调 用页面类中 OnTextChanged事件函数TextBox1_TextChanged(),而TextBox1_TextChanged()函 数是页面类中的一个方 法,所以TextBox就可以在该函数内调用页面类中的其他方法和属性了。(当然也 是可以调用TextBox1自 己的)。

2.回发的原理

Web开发的人员都知道,客户端回发到服务端的事件只有一个,那么在服务端 怎样的区分用户执行了 怎样的操作呢?这里首先从ASP.NET的页面请求说起了。

在ASP.NET中处理页面时,前后两个页面之间是无状态连接的,也就是说客户 端的前后两次请求是相 互独立的,服务端不会保存前一次请求的页面状态。如此就引入了视图状态机制 (我会在以后的文章中 和大家分享下ASP.NET开发的视图状态和控件状态机制的研究乐趣)来处理前后两 次请求的逻辑处理,其 原理就是在前一次请求发生后服务端将页面的逻辑信息保存在一个隐藏的字段中 回送到客户端,当后一 次请求发生时服务端首先取出该隐藏字段中的值并恢复到各个视图控件中,等逻 辑处理完后再将新的数 据保存到该隐藏字段会送到客户端,从而延续了两次页面之间的状态信息。

本文中要说明的回发就是在视图状态机制基础上完成的,也就是通过比较发送 到服务端的控件当前值 和保存在隐藏字段中的旧值,从而决定是否触发哪些事件。当然,自定义的控件 类必须通过继承 IPostBackDataHander接口来完成事件的回发功能。