深入理解 __doPostBack

在我的随笔《Page,你是怎样处理回发事件的?》中曾提出一个疑问,如何得到引起页面PostBack的控件?通过阅读Page类的源码,误打误撞,无意中看到了__EVENTTARGET和__EVENTARGUMENT这两个常量的定义,并通过调试分析页面,知道了通过Request.Form[“__EVENTTARGET”]可以获取到触发页面PostBack的事件源(控件的ID)。对于一般的控件,这样就可以了,唯有Button和ImageButton触发的PostBack无法通过这种方式获取到它们的ID,起初还以为是它们实现的接口的不同而产生PostBack方式的不同。刚刚在AspAlliance.看到一篇关于__doPostBack的文章(原文:《Understanding the JavaScript __doPostBack Function》),才真正明白了页面PostBack的内在机制,疑团也终于解开了。下面来简单看一下页面PostBack的原理,和Button,ImageButton PostBack的特殊性。
__doPostBack是一个纯粹并且是非常简单的javascript函数,大部分的页面PostBack都是由它触发的。注意,这里是“大部分”,因为只有两个Web Server Control 会自己触发页面的PostBack,其它的所以控件都是通过__doPostBack函数触发页面的PostBack,那先来看一下这个函数的定义吧:

操作方法

  • 01

    CODE1: <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } 通过上面的代码可以看到,__doPostBack带有两个参数,eventTarget是标识将要引发页面PostBack的控件ID,eventArgument参数提供了在引发页面PostBack事件时所带的额外参数。当然这个函数被函数时,这两个参数的值将赋值给页面的两个隐含变量__EVENTTARGET和__EVENTARGUMENT,然后调用页面的submit方法提交页面表单。这就是为什么我们可以通过Request.Form[“__EVENTTARGET”]获取得到引发页面PostBack的控件ID的原因。

  • 02

    了解了__doPostBack函数后,我们可以很容易的利用它非常方便地自己触发自定义的PostBack事件。那上面也说了,大部分的控件都是调用这个方法来引了页面的PostBack,只有两个控件是例外,Button 和 ImageButton,正是因为它们不是通过调用__doPostBack来回发事件,所以通过表单隐含变量__EVENTTARGET和__EVENTARGUMENT是无法获取得到引发PostBack的Button或ImageButton的ID和参数值的,只有通过下面的方式才能得它们的实例,进而判断是哪个控件引发的PostBack的:

  • 03

    CODE2: foreach (string str in Request.Form) { Control c = Page.FindControl(str); if (c isButton) { control = c; break; } } 为什么能通过枚举Request.Form集合的Key值,查找到的回发事件源呢?在这里Button和ImageButton又有一些不同。Button控件引发的PostBack,会将Button本身的ID作为Request.Form的一个Key,它的Value是Button的Text属性值,回传给服务器,这样服务器就可以通过枚举Request.Form的Key值,去查找出控件实例,判断是否为Button控件,进而得到是哪个控件引发的PostBack事件。而ImageButton的不同就在于,它不仅仅是用ImageButton的ID作为Request.Form的Key,它是用ImageButton的ID加上.x和.y,作为Key,在Request.Form添加两上键值对,这两个键值对的值应该是标识ImageButton的图片大小。同样的,了解了这个规律后,我们仍然可以通过一定的方式得到是否是由ImageButton引发的PostBack。 总结:理解并掌握__doPostBack原理对我们更加了解Page的事件模型有非常大的帮助,并且也是我们进一步利用好页面的PostBack事件的一个重要基础。在整个asp.net页面PostBack模型中,只有Button和ImageButton是个例外,其它的控件都是一样的,也就是使用__doPostBack函数。在当我们需要通过__EVENTTARGET取得到事件源控件的话,这点是特别要注意的。

(0)

相关推荐

  • 基础知识:理解网络交换机的原理

    二层交换机概述   一、交换机的工作原理 1.交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射,并将其写入MAC地址表中。   2.交换机将数据帧中的目的MAC地址同已建立的MAC地址 ...

  • Windows 8 应用框架理解及开发工具使用实例教程

    Windows 操作系统之所以风靡世界,是因为其“易学易用”,从用户的角度出发,让数以万计的非IT人员使用计算机实现娱乐,工作等目的。Windows 8继承Windows桌面的优点,同时提供一种新的用 ...

  • linux网络协议是什么?该如何去理解?

    网络协议有很多,但大多是针对windows的,那么linux网络协议你是怎么样理解的呢?本文和大家一起探讨这个问题。 Linux网络协议栈基于分层的设计思想,总共分为四层,从下往上依次是:物理层,链路 ...

  • 交换机三种端口模式Access.Hybrid和Trunk的理解

    今天有个朋友问交换机trunk是什么意思,百度了以下,发现特别详细的介绍。 TRUNK是端口汇聚的意思,允许交换机与交换机、交换机与路由器、主机与交换机或路由器之间通过两个或多个端口并行连接同时传输以 ...

  • BIOS的理解以及实现详细介绍

    简单介绍,如果专门做firmware相关的朋友应该比较熟悉。本文主要针对新手,BIOS的理解以及实现介绍,希望对新手有帮助。 先说说刷写,对于rom文件,无论是什么文件格式,bin也好,rom也好.. ...

  • 理解Linux文档属性、拥有者、群组、权限、差异知识点小结

    写在前面 我们都知道Linux是一个支持多用户.多任务的系统,这也是它最优秀的特性,即可能同时有很多人都在系统上进行工作,所以千万不要强制关机,同时,为了保护每个人的隐私和工作环境,针对某一个文档(文 ...

  • LINUX怎么理解硬链接数的含义?

    LINUX里硬链接数的含义该怎么理解?今天我们就来详细介绍一下. 1.打开LINUX操作系统,可以使用UBUNTU. 2.找到左边任务栏的终端窗口并且打开. 3.改变为桌面目录,然后查看文件和目录的具 ...

  • 如何理解并关闭华为手机显示的HD图标?

    很多人在使用华为手机时都会发现手机的最上方菜单栏中显示有[HD]字样的图标,但是却不知道是什么意思,并且也不知道该如何关闭这个图标.其实[HD]图标可以理解成[高清语音通话功能],接下来小编就给大家介 ...

  • 如何理解钉钉投屏码并使用投屏码进行投屏?

    现在很多企业都在使用钉钉进行办公,当想要将手机页面通过钉钉投屏到大屏上时会显示输入投屏码.很多人不知道投屏码是什么以及如何使用投屏码进行投屏,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. ...