第一章、 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/gsk99/archive/2008/09/08/1286766.html

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

  1. 页面回传与js调用服务器端事件(转)

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

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

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

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

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

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

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

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

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

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

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

  7. JS调用服务器端方法

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

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

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

  9. js 调用webservice接口

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

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

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

最新文章

  1. SMRT single molecular real time Sequencing
  2. go标准库的学习-time
  3. 【system generator】基于system generator的根号运算系统实现
  4. linux和裸机的区别,操作系统与裸机的区别
  5. 对象的使用 java 1613806439
  6. linux 日志按大小切割_linux下nohup日志切割方案
  7. 《Android内核剖析》读书笔记 第13章 View工作原理【View树遍历】
  8. js生成1~100个随机不重复数
  9. PHP基础知识------页面静态化
  10. 维克仓库管理软件 v3.4 工程网络版 是什么
  11. iOS代码质量要求_iOS 无需越狱修改和平精英极限画质
  12. 《现代控制系统》第四章——反馈控制系统特性 4.1 介绍
  13. Python中main函数
  14. 应该根据哪些判断云服务器的好坏
  15. 编程语言Python为什么这么火?
  16. Mysql的基本操作
  17. 针对Google注册不能收到手机验证码的解决方案
  18. 设计按钮、下拉框、文本框的测试用例要点
  19. JavaScript jQuery修改样式
  20. 机器学习算法之--决策树总结

热门文章

  1. 图神经网络(CNN)一
  2. 1113 小胖子的时钟【水题】
  3. 论文笔记《Aspect-Aware Latent Factor Model:Rating Prediction with Ratings and Reviews》
  4. C语言解决打鱼晒网问题
  5. sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇(十五)
  6. 如何使用openssl创建根CA和中间CA以及签署其他client证书请求
  7. 佛说五百年的回眸才换来今生的擦肩而过
  8. 阿里巴巴与山东省人民政府签署战略合作协议
  9. <论文阅读>CRaft
  10. 附加支付和统筹支付_上海市医疗保险,请问账户支付和统筹支付是什...