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

Asp.net 中在客户端触发服务器端事件分为两种情况:

一.   WebControls中的Button 和HtmlControls中的Type为submit的HtmlInputButton

这两种按钮最终到客户端的表现形式为:<input 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" value="" />

<!―表示触发事件的参数,一般是当某个控件有两个以上的事件时,用来区别是哪个事件 -->

<input type="hidden" value="" />

 

2.服务端会生成一个jscript的方法来处理所有这些事件的发送,这段代码是:

<script language="javascript" type="text/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的点击事件

<!―客户端的点击事件调用__doPostBack,eventTarget 参数为'Button2',表示是name为'Button2’控件触发的事件,eventArgument 为空,表示这个Type为button的HtmlInputButton只有一个客户端触发的服务端事件-->

<input language="javascript" Button2','')" type="button" value="Button" />

又比如,TextBox控件的Change事件

<!―客户端的onchange事件调用__doPostBack,eventTarget 参数为’TextBox1’,表示是name为’TextBox1’控件触发的事件,而TextBox控件只有一个客户端触发的服务端事件TextChanged,故服务器就会去触发这个TextBox的TextChanged事件->

<input type="text" 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" value="" />

<input type="hidden" 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事件。那上面也说了,大部分的控件都是调用

第三章 Button PostBack做法

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

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

<input type="hidden" value="" />

<input type="hidden" 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)

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

(2)

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

<a 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");

}

Bug

问题:『使用__doPostBack会导致』

回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。

问题分析及解决方案:『来源网络』

这个要具体分析。本来这个措施是asp.net2.0用来防止客户端“欺诈”服务器端的。例如本来输出到客户端的一个事件被触发时需要回发的命令是“__doPostback('ctl01$abc','user_1')”的,如果采取采取手段把回发参数由 user_1 改为 user_5 了,服务器端会重新核对输出的是不是user_5,发现和这个页面上一个输出的脚本不一致,就会产生这个异常。

但是,很多程序员写的程序按照过去的习惯(或者按照更加高级灵活的设计例如一些Ajax组件)没有考虑这个问题或者是忽略这个欺诈的可能性,写的程序可能会修改参数或者修改目标控件。

因此这样具体问题具体分析。不太可能跟浏览器距离服务器的远近有关,应该还是编程逻辑问题。你应该对出异常的画面以及所使用的数据进行分析。有时候,经常也需要将这个参数设置为false,放弃安全管理

转载于:https://www.cnblogs.com/iammrwu/archive/2012/02/08/2343060.html

页面回传与js调用服务器端事件(转)相关推荐

  1. asp.net页面回传与js调用服务端事件、PostBack的原理详解(转)

    Asp.net中服务端控件事件是如何触发的 Asp.net 中在客户端触发服务器端事件分为两种情况: 一.   WebControls中的Button 和HtmlControls中的Type为subm ...

  2. asp.net页面回传与js调用服务端事件、PostBack的原理详解

    ASP.ENT中,有两种实现页面PostBack的机制,不管是哪种回传方式,最终均是Form表单提交. 一.原始的Form表单提交 WebControls中的Button和ImageButton控件, ...

  3. asp.net页面回传与js调用服务端事件,Postback的原理

    Asp.net 中在客户端触发服务器端事件分为两种情况: 一.   WebControls中的Button 和HtmlControls中的Type为submit的HtmlInputButton 这两种 ...

  4. html调用父页面的函数,js调用父框架函数与弹窗调用父页面函数的方法

    调用父级中的 aaa的函数 子页面中: οnclick="window.parent.frames.aaa()" 父页面中: function aaa() { alert('bbb ...

  5. js 调用服务器端方法总结

    javascript函数中执行C#代码中的函数: 方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;         2.在前台写一个js函数,内容为documen ...

  6. JS调用服务器端方法

    javascript函数中执行C#代码中的函数: 方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;         2.在前台写一个js函数,内容为documen ...

  7. 耗时很长的服务器端事件中让客户端得到中间过程信息的合理解决方案

    需求:B/S结构的系统里,用户点一个按钮系统开始发送上千封邮件,要求把发送信息(发送成功数,失败数,剩余数量...)动态实时的反馈给客户. 分析和实施过程当中遇到的问题: 一:最低级的问题 由于客户催 ...

  8. js 调用webservice接口

    1:建立的webservice工程正确运行. a: 定义接口类 public interface IMyWebService { public String example(String messag ...

  9. 关于datagrid中控件利用js调用后台方法事件的问题

    前台调用后台方法除了用button的click事件,还可以用js调用  一.前台页面如图 需求点击这个按钮触发后台事件,从而能够调用存储过程 <epoint:HyperLinkColumn He ...

最新文章

  1. java Graphics2D类
  2. 反射获取成员变量并改值
  3. Spring Boot 最流行的 16 条最佳实践!
  4. 天了噜!定义static字段还有顺序要求?
  5. ONVIF协议网络摄像机(IPC)客户端程序开发(2):第一次使用IPC摄像头
  6. checkbox 点击搜索失去焦点_早些年植入三焦点晶体矫正老花的人,现在怎么样了?...
  7. Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)...
  8. Java并发编程实践-this溢出
  9. addEventListener和attachEvent的区别(转载)
  10. 在校大学生如何规划自己的程序员之路
  11. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 ARIMA、AutoARIMA、LSTM、Prophet、多元Prophet 实现
  12. 联想台式主机拆机教程_联想r400拆机教程 拆解电脑没那么难
  13. cin cin.get cin.getlin
  14. 算法设计与分析: 2-13 标准二维表问题
  15. 如何创建强命名程序集(Strong Name Assembly)
  16. 老王的JAVA基础课:第3课 IDEA的安装和使用
  17. 干货 | 敏捷培训必备小游戏,都在这里了!
  18. xmanager linux 远程桌面,Windows系统下通过xmanager远程桌面控制Linux
  19. 基于VOIP的SIP协议分析
  20. 将阿拉伯数字转换成中文大写金额的形式

热门文章

  1. 【CentOS7】【docker】常用操作命令
  2. 【jquery】select下拉框赋值
  3. IntelliJ IDEA部署javaweb项目
  4. 什么叫预判_什么才是真正的用户画像?
  5. 数据库增删改查性能对比
  6. php构造函数里抛出异常_php-在类的构造函数中返回值
  7. qt git linux 安装,git – 如何在Ubuntu上安装QtWebEngine
  8. 苹果手机怎么编辑word文档_原创首发:编辑和修改PDF文档,将PDF转换为WORD技巧...
  9. 再也不怕别人动电脑了!用Python实时监控
  10. 面试系列 | 带你彻底搞懂 Python 装饰器