ASP.NET事件回传机制在ASP.NET里面我们最喜欢做的事情是拖动一个Button然后双击,然后输入代码就可以了。这个称之为事件回传机制,属于软件开发的体系范畴,但并不属于Web开发的范畴,因为Web是基于TCP/IP协议的,但是TCP/IP协议确是一个无状态的协议,那么ASP.NET是如何引入事件回传的呢?

  首先请新建一个网站,然后添加一个WebUserControl,命名为:EventModule。如下:

  现在在该EventModule里面拖入一个一个Button和3个Label,如下:

  然后双击该Button,输入如下代码:

this.Label1.Text = this.Button1.ID;
this.Label2.Text = this.Button1.ClientID;
this.Label3.Text = this.Button1.UniqueID;

  将EventModule.ascx 拖入到Default.aspx里面,按F5测试,然后双击一下该Button,看看有什么情况。我这情况如下:

  会不会觉得很疑惑呢?为什么这三个ID都不一样呢?那么事件模型机制跟这存在着什么联系呢?OK,我们右击该网页,选择查看源码,找到这一行:

  <input type="submit" name="EventModule1$Button1" value="EventButton" id="EventModule1_Button1" />

  哦,这个是什么?懂得ASP.NET的人会马上发现这个是该Button生成的HTML代码,搞ASP.NET开发的人可能会经常忽略掉这个HTML,因为这个并不是手工编写的,自己使用的挺方便的不是吗?如果这样想,那么我们这课也就没有什么意义了,刨根问底这是我最爱做的事情,如果您打算挖掘下去,那么请您继续,我保证这会让您对ASP.NET的根本会有深的了解,当这些根本的认识积累到一定程度后,就能编写出高性能的Web交互网站。

  问题到这后我们该研究的是什么呢?大家可以想一想当客户端有人点击这个Button这后,服务器端能准确无误的响应相应的事件,那么想必在服务器端有一个找到该Button的方法,但是通过什么方法找到呢?

  为了形成对比,比如为什么服务器知道是这个Button而不是另外一个Button触发了事件,我们在EventModule.ascx中拖入另一个Button,并双击它给它一个onclick事件,如下:

  现在给上面的一个Button的事件代码里插入一个断点(注意,该断点只有在F5模式下才有用),如下:

  F5测试,点击该Button,就会返回到VS2005调试模式下。“局部变量”窗口->this->base->Request下找到Form元素,如下展开:

  注意上面的绿色高亮显示的地方,这里可以发现,即使我们放置了两个Button,但是通过TCP/IP协议返回到服务器端的却只有一个Button,并且该Key为那个Button在客户端对应的name值:EventModule1$Button1。这也是我为什么最开始让你们查看源代码的原因(注意:EventModuel1是EventModule.ascx在Default.aspx上自动创建的ID)。好了,真相应该比较清楚了,那么ASP.NET是如何通过EventModule1$Button1找到该Button的呢。首先我们可以做如下分析Default.aspx下有一个Child,名为EventModule1,EventModule1下有一个Button,名为Button1。于是“$"就成了我们查找子控件的标识符,由于在同一级页面里的所有子控件的ID必须不同,因而每个对象都对应一个UniqueID,也就是EventModule1$Button1,那么ASP.NET就能通过这种方式准确无误的找到我们对应的控件,并激活它所对应的OnClick事件。

呵呵,有点不知所云了吧,其实如果您对传统网站开发做过深入挖掘的话,这个是很好理解的,但是对于ASP.NET新手来说,这些可能是连自己想都没想过的事情,对底层的东西没有了解,很容易被ASP.NET的易用性引入一种误区。

  那么LinkButton的事件又是如何实现的呢?LinkButton并不是属于form 中post方法中回传的数据,那么ASP.NET又是如何成功做到的呢?下面您将EventModule.ascx里面的控件全部删掉,并删掉EventModule.ascx.cs对应的代码,然后拖入一个LinkButton,然后双击它给它一个事件,按F5进入测试页面,右击打开源代码。会看到如下数据:<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<script type="text/javascript">
<!--
var theForm = document.forms['form1'];
if (!theForm) {
  theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
  if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
    theForm.__EVENTTARGET.value = eventTarget;
    theForm.__EVENTARGUMENT.value = eventArgument;
    theForm.submit();
  }
}
// -->
</script>
<a id="EventModule1_LinkButton1" href="javascript:__doPostBack('EventModule1$LinkButton1','')">LinkButton</a>

  是不是看完后比较明白点什么呢?当该LinkButton被点击后,触发一个javascript函数__doPostBack('EventModule1$LinkButton1',''),前面一个参数就是其所对应的UniqueID,后面一个参数是__EventArgument,很少用到。函数被触发,然后将eventTarget和eventArgument的值传递给两个hidden input,由于hidden input会随着form表单的提交而传递到服务器端,于是在服务器端就得到了该LinkButton的UniqueID,然后再通过上述方法在网页生命周期前便很快地找到对应的控件,并触发事件。

ASP.NET事件回传机制相关推荐

  1. ASP.NET 事件(回传)机制

    摘要: ASP.ENT中,有两种实现页面PostBack的机制,不管是哪种回传方式,最终均是Form表单提交. 一.原始的Form表单提交 WebControls中的Button和ImageButto ...

  2. ASP.NET WebForm 回传机制

    为什么每个WebForm.aspx都必须包含在form之中 <form id="form1" runat="server">//html </ ...

  3. asp.net页面回传与js调用服务端事件、PostBack的原理详解

    ASP.ENT中,有两种实现页面PostBack的机制,不管是哪种回传方式,最终均是Form表单提交. 一.原始的Form表单提交 WebControls中的Button和ImageButton控件, ...

  4. asp.net的处理机制(.ashx/.aspx)

    浅谈自己对asp.net 处理机制的图解 图解的内容有点多(包含asp.net 的处理机制和页面生命周期的重要事件,建议小伙伴把图片下载查看可好?) asp.net处理机制解说 当浏览器发送一条请求给 ...

  5. DotText源码学习——ASP.NET的工作机制

    --本文是<项目驱动学习--DotText源码学习>系列的第一篇文章,在这之后会持续发表相关的文章. 概论 在阅读DotText源码之前,让我们首先了解一下ASP.NET的工作机制,可以使 ...

  6. Android之Android触摸事件传递机制

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53431274 本文出自:[顾林海的博客] ##前言 关于Android ...

  7. Android Touch事件传递机制解析 (推荐)

    最近新闻列表里的下拉 down up  move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...

  8. Android中事件分发机制的总结

    原文出处:http://blog.csdn.net/jdsjlzx/article/details/52355249 事件传递虽然算不上某个单独的知识点,但是在实际项目开发中肯定会碰到,如果不明白其中 ...

  9. Android 事件分发机制

    Android 事件分发机制  demo验证:  https://blog.csdn.net/hty1053240123/article/details/77866302 目录 1.基础认知 2.事件 ...

  10. Android系统(120)-android的事件分发机制

    android的事件分发机制 android的事件分发机制 比如说,现在你所在的公司中有一项任务被派发下来了,项目经理把项目交给你的老大,你的老大老大手下有很多人,看了看觉得你做很合适,把这个任务交给 ...

最新文章

  1. ionic4中实现时间线
  2. J. Cheminform. | GraphSol:预测接触图助力蛋白质溶解度预测
  3. C#中创建DLL(动态链接库)及其使用
  4. Nodejs Hello world benchmark
  5. c++语言函数strcpy,C++中函数的安全版本的意义及strcpy函数的功能和差别(图)
  6. Linux问题分析或解决_samba无法连接
  7. Exchange 2016 之移动设备邮箱策略
  8. 中断(一)—— 综述
  9. delphixe android服务,delphi xe10 android服务gps [复制]
  10. GPS定位技术相关的毕业论文有哪些呢?
  11. iPhone手机硬件拆解介绍
  12. 计算机学报在线阅读,计算机学报CHIN
  13. word文档里面怎样自动生成目录
  14. 移动端webscoket连接失败---code1006
  15. 一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?
  16. iphone ipad 为孩子创建 apple id
  17. JQuery下拉框与复选框
  18. Kotlin 之 协程(四)协程并发
  19. 常用的sql语句,sql使用大全
  20. 为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法

热门文章

  1. 【语音合成】基于matlab比例重叠相加法信号分帧与还原【含Matlab源码 561期】
  2. 【基础教程】基于matlab工具voicebox函数中文说明【含Matlab源码 032期】
  3. c截取字符串中的一部分_2019年!史上最全Python基础题(50道题详解)持续更新中-第二篇...
  4. 380v pcb 接线端子_220V线圈的接触器改成380V线圈方法
  5. win10 nginx文件服务器,Windows10下 FFmpeg + Nginx 的 rtmp 服务器搭建
  6. mysql event查询_Mysql中Event的一些测试
  7. javaScript中的Object类型
  8. Zabbix中文使用手册
  9. 运用正则表达式在Asp中过滤Html标签代码的四种不同方法
  10. Linux中service命令和/etc/init.d/的关系