深入理解 __doPostBack 客户端调用服务端事件

下面来简单看一下页面PostBack的原理,和Button,ImageButton PostBack的特殊性。
__doPostBack 是一个纯粹并且是非常简单的javascript函数,大部分的页面PostBack都是由它触发的。注意,这里是“大部分”,因为只有两个Web Server Control 会自己触发页面的PostBack,其它的所以控件都是通过__doPostBack函数触发页面的PostBack,那先来看一下这个函数的定义吧:

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

foreach  ( string  str  in  Request.Form)
{
Control c 
=  Page.FindControl(str);
if  (c  is  Button)
{
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取得到事件源控件的话,这点是特别要注意的。

本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/15519.htm

 

PS:

可试着读出所有Request.Form中的值。就可以知浏览器传了什么过服务器。

你可能感兴趣的:(post)