zoukankan      html  css  js  c++  java
  • 探索Asp.net的Postback机制

    /* from: http://www.techmango.com/blog/article/DotNet/Explore_Asp_net_postback_mechanism.htm */

    __doPostBack作为在asp.net中一个很核心很重要的部分,我们有必要深入了解一下.

    其实,__doPostBack是一个很简单的脚本函数.代码如下:

    //__doPostBack<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();}}

    原来是在submit上做文章啊.microsoft呈现给我们的就是这种精巧的思维!

    我看到,asp.net现在页面上添加了两个hidden input,这两个input分别用来存放触发postback的control的ID和参数.这就是我们大部分人认识到的:

    __doPostBack(obj1,obj2)的第一个参数是控件ID,第二个参数是postback的参数.然后就可以在后台用Request.Form["__EVENTTARGET"]和 Request.Form["__EVENTARGUMENT"]取得控件ID和参数.

    不过,另外要注意的就是asp.net的webcontrols中,Button或其它***Button,如ImageButton就特殊了,它们不是利用 __doPostBack来实现postback的.为什么这样,可能因为Button在html中本来就是有触发submit事件的功能吧.asp.net不过是要令原来html中一些不能触发submit的东西submit,才弄出了__doPostBack来实现吧.

    所以如果是Button的postback,在后台是不能用Request.Form["__EVENTTARGET"]和Request.Form["__EVENTARGUMENT"]取得控件ID和参数的.那么,怎么取呢?看代码:

    //取Buttonforeach (string str in Request.Form){  Control c = Page.FindControl(str);  if (c is Button)  {    control = c;    break;  }}

    上述写法可以在后台找到Button.在Button的提交过程中,Button会将Button本身的ID作为Request.Form的一个Key,它的Value是Button的 Text属性值,回传给服务器.所以可以在后台循环Form.Keys取到所提交的Button,以执行相应的函数.ImgButton也差不多,不同就在于,它不是用ImageButton的ID作为Request.Form的Key,它是用ImageButton的ID加上.x和.y作为Key,在 Request.Form添加两上键值对,这两个键值应该是对应ImageButton的图片大小的,了解了这个规律后,我们仍然可以通过一定的方式得到是否是由ImageButton引发的PostBack.

    通过获取到提交过来的控件ID后, Asp.net就能找到对应注册了事件的控件,并触发事件了.

    示例

  • 相关阅读:
    LeetCode 368Largest Divisible Subset
    macbook 源码安装 redis6.2.6
    macbook 源码安装 nginx1.20.1
    MySQL总结
    DataWork之 MaxComputer的使用
    Spring的IOC源码分析
    Spring Bean的生命周期
    SpringMVC工作原理
    Spring全家桶(二)之SpringMVC总结
    (已经成功部署)配置vue+nginx+uwsgi luffy项目
  • 原文地址:https://www.cnblogs.com/kofkyo/p/2297275.html
Copyright © 2011-2022 走看看