Asp.net 中在客户端触发服务端事件分为两种情况:
** 一. ** ** WebControls ** ** 中的 ** ** Button ** ** 和 ** ** HtmlControls ** ** 中的 ** ** Type ** ** 为 ** ** submit ** ** 的 ** ** HtmlInputButton **
这两种按钮最终到客户端的表现形式为:
1<input id="Submit1" name="Submit1" type="submit" value="”Submit”"/>
,这是 Form 表单的提交按钮,点击以后会作为参数发送到服务端,参数是这样的: 控件的 name 属性 = 控件的 value 值,对应上面的例子就是: Submit1= Submit 。 服务端会根据接收到的控件的 name 属性的这个 key 来得知是这个按钮被点击了,从而在服务端触发这个按钮的点击事件。
** 二. ** ** ImageButton ** ** 或者 ** ** HttpInputImage: **
这些控件到客户端的表现类似这样的:
1<input id="img1" type="image"/>
,点击了这样的控件会直接提交表单,作用同提交按钮。点击了这样的控件传到服务端的参数是这样的: id.x=nn&id.y=nn ,对应到上面的例子就是: img1.x=nn&img1.y=nn
** 三. ** ** HtmlControls ** ** 中的 ** ** Type ** ** 为 ** ** button ** ** 的 ** ** HtmlInputButton ** ** 和其它所有的控件事件,比如 ** ** LinkButton ** ** 点击, ** ** TextBox ** ** 的 ** ** Change ** ** 事件等等: ** ** **
这些事件在客户端产生后会经过一个统一的机制发送到服务端。
1. 首先 asp.net 页框架会使用两个 Hidden 域来存放表示是哪个控件触发的事件,以及事件的参数:
1<input name="__EVENTTARGET" type="hidden" value="">
2<!--— 表示触发事件的参数,一般是当某个控件有两个以上的事件时,用来区别是哪个事件 \---->
3<input name="__EVENTARGUMENT" type="hidden" value="">
4
52\. 服务端会生成一个 jscript 的方法来处理所有这些事件的发送,这段代码是:
6
7<script language="javascript">
8
9<!--
10
11function __doPostBack(eventTarget, eventArgument) {
12
13var theform = document.WebForm2;
14
15theform.__EVENTTARGET.value = eventTarget;
16
17theform.__EVENTARGUMENT.value = eventArgument;
18
19theform.submit();
20
21}
22
23// -->
24
25</script>
26
273\. 每个会引发服务端事件的控件都会在响应的客户端事件中调用上面的代码:
28
29比如, HtmlControls 中的 Type 为 button 的 HtmlInputButton 的点击事件
30
31<!--— 客户端的点击事件调用 __doPostBack , eventTarget 参数为 'Button2' ,表示是 name 为 'Button2’ 控件触发的事件, eventArgument 为空,表示这个 Type 为 button 的 HtmlInputButton 只有一个客户端触发的服务端事件 \---->
32<input id="Button2" language="javascript" name="Button2" onclick="__doPostBack('Button2','')" type="button" value="Button"/>
33
34又比如, TextBox 控件的 Change 事件
35
36<!--— 客户端的 onchange 事件调用 __doPostBack , eventTarget 参数为 ’TextBox1’ ,表示是 name 为 ’TextBox1’ 控件触发的事件,而 TextBox 控件只有一个客户端触发的服务端事件 TextChanged ,故服务器就会去触发这个 TextBox 的 TextChanged 事件 --->
37<input id="TextBox1" language="javascript" name="TextBox1" onchange="__doPostBack('TextBox1','')" type="text"/>
38
394\. 客户端触发事件后调用 __doPostBack 方法,将表示触发的控件源的 eventTarget 和事件参数 eventArgument 分别付给两个隐藏域 __EVENTTARGET 和 __EVENTARGUMENT ,然后提交 Form ,在服务端根据 __EVENTTARGET 和 __EVENTARGUMENT 来判断是哪个控件的什么事件触发了。</input></input>