惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
G
Google Developers Blog
腾讯CDC
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
人人都是产品经理
人人都是产品经理
博客园_首页
T
Tailwind CSS Blog
C
Check Point Blog
博客园 - 【当耐特】
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
Y
Y Combinator Blog
L
LangChain Blog
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

博客园 - 尹合磊

用ObjectDataSource实现自定义分页的心得总结 如何:在 Calendar 控件中显示数据库中的选定日期 AddNew 方法创建可更新 Recordset 对象的新记录。 求一“从所有同类中排除某一类型”正则表达式? 按字节长度截取字符串(支持截取带HTML代码样式的字符串) ASP.NET2.0资料收藏 asp中通过一个全局方法来防止SQL注入式攻击 在一个JS文件中包含中文字符串,通过innerHTML输出后中文乱码? 解决TreeView中使用JavaScript完成CheckBox全选的办法 Yahoo邮箱POP、SMTP服务器设置详解 关于前台调用后台事件__doPostBack函数 marquee基本语法的全解释 SHTML 教程 SQL:以指定的次数重复字符表达式 JavaScript不间断连续图片滚动效果 Asp.net(C#)给图片加上水印效果 ASP.NET(C#)生成缩略图 ASP.NET中存取图片到数据库的示例 Data Access Application Block--使用存储过程,参数及事务
客户端触发Asp.net中服务端控件事件
尹合磊 · 2008-06-12 · via 博客园 - 尹合磊

第一章、 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");
            }