Asp.net 中服务端控件事件是如何触发的

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>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus