C#-[祈福]天佑中华 众志成城 抗震救灾 重建家园

你的苦难就是我们的苦难,你的希望就是我们的希望。当灾难来临时,我们与你在一起,一起为逝者默念安息、一起为伤者祈祷平安。而更多的关怀和力量,正悄悄在汇集:天佑中华,众志成城;抗震救灾、重建家园......
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

客户端触发Asp.net中服务端控件事件

Posted on 2008-06-12 10:31  尹合磊  阅读(579)  评论(0编辑  收藏  举报

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

Asp.net  中在客户端触发服务端事件分为两种情况:
  
  .   WebControls  中的  Button    HtmlControls  中的  Type    submit    HtmlInputButton
  
  这两种按钮最终到客户端的表现形式为: <input name="Submit1" id="Submit1" type="submit" value=”Submit”>,这是  Form  表单的提交按钮,点击以后会作为参数发送到服务端,参数是这样的: 控件的  name  属性=控件的  value  值,对应上面的例子就是:Submit1= Submit 服务端会根据接收到的控件的  name  属性的这个  key  来得知是这个按钮被点击了,从而在服务端触发这个按钮的点击事件。
  
  .   HtmlControls  中的  Type    button    HtmlInputButton  和其它所有的控件事件,比如  LinkButton  点击,TextBox    Change  事件等等:
  
  这些事件在客户端产生后会经过一个统一的机制发送到服务端。
  
  1.    首先  asp.net  页框架会使用两个  Hidden  域来存放表示是哪个控件触发的事件,以及事件的参数:
  
  <!―表示触发事件的控件,一般是这个控件的  name -->
  
  <input type="hidden" name="__EVENTTARGET" value="" />
  
  <!―表示触发事件的参数,一般是当某个控件有两个以上的事件时,用来区别是哪个事件 -->
  
  <input type="hidden" name="__EVENTARGUMENT" value="" />
  
  2.    服务端会生成一个  jscript  的方法来处理所有这些事件的发送,这段代码是:
  
  <script language="javascript">
  
  <!--
  
  function __doPostBack(eventTarget, eventArgument) {
  
  var theform = document.WebForm2;
  
  theform.__EVENTTARGET.value = eventTarget;
  
  theform.__EVENTARGUMENT.value = eventArgument;
  
  theform.submit();
  
  }
  
  // -->
  
  </script>
  
  3.    每个会引发服务端事件的控件都会在响应的客户端事件中调用上面的代码:
  
  比如,HtmlControls  中的  Type    button    HtmlInputButton  的点击事件
  
  <!―客户端的点击事件调用__doPostBackeventTarget  参数为'Button2',表示是  name  'Button2’控件触发的事件,eventArgument  为空,表示这个  Type    button    HtmlInputButton  只有一个客户端触发的服务端事件-->
  
  <input language="javascript" onclick="__doPostBack('Button2','')" name="Button2" id="Button2" type="button" value="Button" />
  
  又比如,TextBox  控件的  Change  事件
  
  <!―客户端的  onchange  事件调用__doPostBackeventTarget  参数为’TextBox1’,表示是name  ’TextBox1’控件触发的事件,而  TextBox  控件只有一个客户端触发的服务端事件  TextChanged,故服务器就会去触发这个  TextBox    TextChanged  事件->
  
  <input name="TextBox1" type="text" id="TextBox1" onchange="__doPostBack('TextBox1','')" language="javascript" />
  
  4.    客户端触发事件后调用__doPostBack  方法,将表示触发的控件源的  eventTarget  和事件参数  eventArgument  分别付给两个隐藏域__EVENTTARGET  __EVENTARGUMENT,然后提交  Form,在服务端根据__EVENTTARGET  __EVENTARGUMENT  来判断是哪个控件的什么事件触发了。

第二章 PostBack  的原理

 __doPostBack  是一个纯粹并且是非常简单的  javascript  函数,大部分的页面  PostBack  都是由它触发的。注意,这里是大部分,因为只有两

Web Server Control    会自己触发页面的  PostBack,其它的所以控件都是通过__doPostBack  函数触发页面的  PostBack,那先来看一下这个函

数的定义吧:

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  的控件  IDeventArgument  参数提供了在引发页面  PostBack  事件时所带的额外参数。当然这个函数被函数时,这两个参数的值将赋值给页面的两个隐含变量__EVENTTARGET  __EVENTARGUMENT,然后调用页面的  submit  方法提交页面表单。这就是为什么我们可以通过Request.Form[“__EVENTTARGET”]获取得到引发页面  PostBack  的控件  ID  的原因。

   了解了__doPostBack  函数后,我们可以很容易的利用它非常方便地自己触发自定义的  PostBack事件。那上面也说了,大部分的控件都是调用

第三章 Button PostBack  做法

引了页面的  PostBack,只有两个控件是例外,Button    ImageButton,正是因为它们不是通过调用__doPostBack  来回发事件,所以通过表单隐含变量__EVENTTARGET  __EVENTARGUMENT  是无法获取得到引发  PostBack    Button    ImageButton    ID  和参数值的,可通过下面的方式实现

1 在页面中加如  LinkButton ,页面就会在页面中加载  POSTBACK  所需的  JS

<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();

}

}

 

2)利用  GetPostBackEventReference  给客户端生成__doPostBack()
如:

比如前台页面

<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>

1

<href="#" onclick="document.getElementById('Button1').click()">触发服务器端按钮事件</a>

2
利用  GetPostBackEventReference  给客户端生成__doPostBack()
前台

<href="#" onclick="<%=PostBack()%>">触发服务器端按钮事件</a>

后台

protected string PostBack()
     {
            
return this.Page.GetPostBackEventReference(this.Button1,"haha");
        }

通过__EVENTARGUMENT="haha"可以判断是不是点了那个链接的  PostBack
  Button1的按钮事件这么写:

if(Request["__EVENTARGUMENT" ]=="haha")
         {
                Response.Write("
这个是链接的  PostBack");
            }
            
else
         {
                Response.Write("
这个不是链接的  PostBack");
            }