控件事件和数据回发概述

本文节选自《庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术》一书

在讲解实现控件事件和数据回发功能之前,有必要先了解一下相关的基本概念。
5.1.1  事件及其意义
要为控件定制事件,先得使用控件的事件。首先以经典的Button控件的OnClick事件为例子,说一下事件的使用模型。
1.注册事件
<asp:Button ID="Button1" runat="server"OnClick="Button1_Click"Text="Button"/>
或在Page_Load中注册:
protected void Page_Load(object sender, EventArgs e)
{
    this.Button1.Click +=new EventHandler(Button1_Click);
}
2.事件方法体
protected void Button1_Click(object sender, EventArgs e)
{
}
首先从事件要实现的功能角度理解事件。我们把按钮(Button)看做一个对象,把页面(Page)也看做一个对象。
正向理解:假如我们在Page对象中要修改Button的行为,可以直接通过this.Button1的形式直接访问Button对象的属性或方法对Button进行修改,可以理解为Page类能访问到Button代码功能。原因是Button1是Page类内部的一个对象,类当然可以直接访问其内部的对象。
逆向理解:假如我们需要在Button中要访问Page中的代码呢?直接像上面那样通过this.Page的形式是不行的,因为Button是Page类的内部对象,但Page不是Button类的内部对象,从面向对象角度讲,类(Button)不能访问其外部的对象(Page),也就是说在Button中不可能通过this.Page的形式访问到Page对象。而使用事件机制就可以解决此问题,即事件机制解决了面向对象编程中不允许类访问类外部代码问题。关于事件的应用本章后面会专门讲解,在这里仅介绍一下它的功能。
更深层了解一下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将响应发送回客户端。这样,用户感觉就像在使用桌面应用程序一样。但是,控件开发人员必须了解只有一个客户端事件发送到服务器,即回发事件。
有些在客户端执行的事件(如JavaScript定义的客户端事件)没有被发送到服务器,不能被服务端处理,这样的事件不是我们这一章要讲的事件,本章讲的是服务器控件事件,是由服务器来处理的事件。
5.1.2  数据回发机制
在ASP.NET技术的服务器编程中,服务器处理完客户端的每个请求就认为任务结束,当客户端再次请求时,服务器会作为新的一次请求处理,即使是相同的客户端也是如此。也就是说服务器不会保存我们两次请求之间的一些前后相接的数据,这就比较麻烦了,比如当我们输入一些信息到一个文本中,然后提交一个按钮,很多时候我们要在按钮提交的服务端事件中处理提交之前的数据和提交按钮时用户输入的最新数据,即想同时得到文本框的旧值和新值,而服务端不会保存前一个请求的任何信息,那怎样才能做到这一点呢?
两次页面请求之间的数据关联性问题,ASP.NET是通过视图机制实现的。简单地讲,视图区域信息(ViewState)存储在页面上的一个隐藏字段,里面存储每次需要视图机制保存的一些信息,每次提交时,它都会以“客户端到服务端”的形式来回传递一次,当处理完成后,最后会以处理后的新结果作为新的视图信息存储到页面中的隐藏字段,并与页面内容一起返回到客户端。后面会有针对视图状态机制的专门讲解,这里仅了解其功能即可。
有了视图机制,在其基础之上的数据回发机制就是完成处理视图信息的功能。具体过程是,服务端控件只要实现IPostBackDataHandler接口,则当客户端提交请求后,就会有机会利用IPostBackDataHandler接口的LoadPostData方法,在该方法内部处理子控件的新旧值逻辑,而视图信息数据这时以一个集合对象形式作为LoadPostData参数,并可以决定是否引发控件值变化后的事件。这就是要引入数据回发机制功能的原因。
通过上面两小节的讲解,您应该对事件和数据回发机制有了比较系统的认识。这样会较容易理解接下来要讲的事件和数据回发机制的具体使用和实践部分内容。

庖丁解牛:控件事件和数据回发概述相关推荐

  1. delphi多线程超时控Delphi7中Indy控件对于网络数据的接收

    1.引言 随着我国经济和社会的发展,水资源的科学管理与合理配置显得越来越重要.而获取大量的.实时的.动态的水资源及其相关信息则是实现水资源科学管理的基础.传统的水资源信息获取采用人工抄取数据后逐级的方 ...

  2. Asp.net中服务端控件事件是如何触发的(笔记)

    Asp.Net 中在客 户端触发服务器端事件分为两种情况: 一.   WebControls中的Button 和HtmlControls中的Type为submit的HtmlInputButton 这两 ...

  3. 在DataList控件中删除数据记录

    (一)在DataList控件中删除记录的设计要点 在DataList控件中删除数据记录的设计相对简单一点.该功能设计的重点在于当用户单击[删除]按钮时,程序如何判断要删除的是哪一行.使DataList ...

  4. 用 .Net WebBrowser 控件获取POST数据

    用 .Net WebBrowser 控件获取POST数据     很多应用中,开发者需要自己构建一个浏览器,并且对通过这个浏览器提交的请求进行截获,比如用户通过这个浏览器浏览了一个网页,并向网站提交( ...

  5. .net组件开发系列之武术系列 武术招数 控件生命周期与控件事件机制

    .net组件开发系列之武术系列 武术招数 控件生命周期与控件事件机制一.控件生命周期 先回述上篇,可能表述没有不清晰,也可能跨度大了点,好的,我们来一个循序渐进过程,大家都知道,武术都有招术的,先出什 ...

  6. 深入学习SAP UI5框架代码系列之五:SAP UI5控件的实例数据修改和读取逻辑

    这是Jerry 2021年的第6篇文章,也是汪子熙公众号总共第277篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) SAP UI5 module懒加载机制 ...

  7. Asp.net--DropDownList控件绑定数据库数据

    DropDownList控件绑定数据库数据:DB是公共类,reDt是公共类中的方法 放在Page_Load事件中 if (!IsPostBack){DB db = new DB();DataTable ...

  8. 重复控件Repeater和数据列表控件DataList

    5.3  重复控件Repeater和数据列表控件DataList 本节介绍ASP.NET中两个数据迭代控件:Repeater和DataList控件.其中,Repeater控件又被称为重复控件:Data ...

  9. python tkinter控件treeview的数据列表显示的实现_code

    素材文件 result.txt result2.txt result.txt文件的数据来源是爬取猫眼电影前一百名的电影,而result2.txt文件只不过是内容上把result.txt的内容复制几十次 ...

  10. HTML控件事件一览表

    HTML控件事件一览表 onabort 当用户中断下载图像时触发. onactivate 当对象设置为活动元素时触发. onafterprint 对象所关联的文档打印或打印预览后立即在对象上触发. o ...

最新文章

  1. uboot 命令使用
  2. JUC锁框架——CyclicBarrier
  3. QT3与QT4中uic的使用差异---李家凯老师
  4. 安卓使用MediaPlayer自定义音频视频播放器
  5. java多线程都有几种方式实现
  6. 2018-7-22-Python全栈开发day30-socket原理与粘包-part1-TCP服务
  7. CSS实现导航栏半透明背景效果
  8. uni-app开发环境配置及混合开发流程
  9. XueTr(PC Hunter) pro 注册分析
  10. Ajax请求回调函数没有被调用
  11. 使用eNSP模拟华为交换机路由器防火墙创建VLAN实现单臂路由
  12. 在hbase shell中执行list抛出异常:ERROR: No valid credentials provided
  13. Matlab中图像剪裁命令——imcrop()
  14. teradata数据库--常用的数据字典表
  15. 数据中台总体技术架构
  16. 【考研英语语法】祈使句
  17. 手机端GSP地图的定位 并且在网页上显示地图的轨迹
  18. Scrapy模块爬取中华英才网招聘信息(分页)
  19. 360安全卫士,还有这么多,小兄弟?
  20. 手机号码转码_中文域名转码,中文域名PunyCode编码转换,中文域名在线转码工具,Punycode编码在线转换工具...

热门文章

  1. PHP面向对象关键词static 、self
  2. 自定义获取焦点的TextView
  3. C#中的委托与事件 笔记
  4. asp.net 多文件上传,兼容IE6/7/8,提供完整代码下载
  5. 转载--Ajax学习---DOM进行Web响应
  6. C++中的命名空间(namespace)介绍
  7. 罗马数字与阿拉伯数字转换
  8. angular动态绑定样式以及改变UI框架样式的方法
  9. spring mvc mvc:default-servlet-handler / 。
  10. 集合点(lr_rendezvous)