__doPostBack作为在asp.net中一个很重要的部分,有必要深入了解一下__doPostBack的来龙去脉的.其实,__doPostBack是一个很简单的JS function.代码如下:

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

因为最终呈现给浏览器的内容都是html内容,采用asp.net技术也不能例外.要实现webcontrol的postback机制.只能在原来的submit上做文章.ms呈现给我们的,就是这种精巧的思维!

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

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

很简单就实现了看似很神奇,以为内部有什么高深的处理的过程!如此轻巧的实现了asp.net的postback机制,佩服佩服!只要我们看懂了上边的代码,对__doPostBack的使用就应该不是什么难事了.可以说__doPostBack就是这么简单的一回事.-_-||

不过,另外要注意的就是asp.net的webcontrols中,Button和ImgButton是异类,它们不是利用__doPostBack来实现postback的.为什么这样,可能因为Button在html中本来就是有触发submit事件的功能吧.asp.net不过是要令原来html中一些不能触发submit的东西submit,才弄出了__doPostBack来实现.对于原来就能submit的Button,又何必多此一举呢.(仅个人理解,未经验证!)

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

取Button
foreach (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.

了解Postback机制对我们理解asp.net的事件触发过程有很大的帮助,好好利用__doPostBack更能灵活的使客户端和服务器端进行交互,获得更好的客户体验.

在.NET中,所有的服务器控件提交到服务器的时候,都会调用__doPostBack这个函数,所以灵活运用这个函数对于我们的帮助还是很大的。  
   
  比如,在我们写程序的时候经常会需要动态的生成一些控件,最简单的方法就是通过一个字符串,比如string   strButton     =     <input   type   =”button”   ID=”button1”>,然后输出到页面,但是如果我们需要这个控件来执行一些服务器的功能,就比较困难了。这里我们就可以用过借用__doPostBack这个函数来完成。接下来我觉个例子来说明一下具体如何调用。  
   
  既然要在服务器端运行那么,我们可以声明一个不可见的LinkButton控件,那通常,我们希望一个控件不可见,通常都是把visible属性设为false。但是在这里我们把LinkButton的Text属性设置为空,来是这个LinkButton不可见(为什么要这么设置,而不是直接设置visible属性,我会在下面说明),接下来我们可以在LinkButton里面写一些服务器端的代码。然后就是如何通过我们动态生成的客户端控件来调用LinkButton里面的功能,我们可以通过一个JavaScript函数来实现  
   
  function   ExcuteOnServer()  
  {  
      //第一个参数是你希望提交到服务器的控件的ID号,第二个参数是事件参数  
        __doPostBack('LinkButtonID','');  
  }  
   
  接下去我们只需要在动态生成的这个Button控件的onclick事件中写上οnclick=”JavaScript:ExcuteOnServer();“,这样当我们点击这个动态生成的客户端控件的时候,他便会执行LinkButton中的代码。  
   
  这样便实现了动态生成的客户端控件提交到服务器端的功能。  
   
  最后要说一下的就是为什么希望LinkButton控件不可见的时候,不是通过visible属性来完成的。因为当我们把visible属性设置为false的时候,浏览器在解析的时候,根本不会把这个控件放在页面上,也就是说这个控件是不存在的,所以我们在调用__doPostBack函数的时候,便会找不到控件。

这里介绍一个常用的函数_doPostBack,这个函数如果如果是ASP.Net render出来的页面就是自动产生这个函数,比如有带autopostback属性的控件,且其属性为true的页面,带编辑列的datagrid页面。
__doPostBack 是通过__EVENTTARGET,__EVENTARGUMENT两个隐藏控件向服务端发送控制信息的,__EVENTTARGET为要调用控件的名 称,如果要调用的控件是子控件,用''$'或':'分割父控件:子控件,__EVENTARGUMENT是调用事件时的参数
下面演示下如何调用后台事件:
1.新建工程
2.拖入一个服务端Button1,一个DropDownList1和一个客户端Button
3.设置DropDownList1的AutoPostBack属性为True,Button1的Visible为False
4.双击Button1,在事件里写下Response.Write("hello:" );
5.页面的HTML里找到客户端Button,写入οnclick="__doPostBack('Button1','')"
6.编译,运行,点击Button是不是出现了"Hello"
7.查看源代码,发现里面多了下面行

<script language="javascript">
<!--
    function __doPostBack(eventTarget, eventArgument) {
        var theform;
        if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
               theform = document.forms["Form1"];
           }
        else {
               theform = document.Form1;
           }
           theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
           theform.__EVENTARGUMENT.value = eventArgument;
           theform.submit();
       }
// -->
</script>

<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />

细心的人会发现,在__doPostBack里,提交调用的是theform.submit(),这样就导致对Form的onsubmit事件校验失效了, 幸好这个问题在asp.net 2.0已经修复了。这里提供一个替换的解决办法,在Form的最下面插入下面的代码,这段代码在保证不管是不是render出来的页面均有效

<script language="javascript">
<!--
    function __doPostBack_Ex(eventTarget, eventArgument)
     {
        var theform;
        if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
               theform = document.forms[0];
           }
        else {
               theform = document.forms[0];
           }

if(!theform.__EVENTTARGET)
         {            
               theform.appendChild(document.createElement("<input type='hidden' name='__EVENTTARGET'>"));
           }
        
        if(!theform.__EVENTARGUMENT)
         {            
               theform.appendChild(document.createElement("<input type='hidden' name='__EVENTARGUMENT'>"));                        
           }
        
           theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
           theform.__EVENTARGUMENT.value = eventArgument;
        if ((typeof(theform.onsubmit) == "function"))
         {
            if(theform.onsubmit()!=false)
             {
                   theform.submit();    
               }
           }
        else
         {            
               theform.submit();    
           }
        
        function __doPostBack(eventTarget, eventArgument)
         {
               __doPostBack_Ex(eventTarget, eventArgument);
           }

}
// -->

理解 __doPostBack--1相关推荐

  1. 深入理解 __doPostBack

    在我的随笔<Page,你是怎样处理回发事件的?>中曾提出一个疑问,如何得到引起页面PostBack的控件?通过阅读Page类的源码,误打误撞,无意中看到了__EVENTTARGET和__E ...

  2. 理解 __doPostBack(转)

    在我的随笔<Page,你是怎样处理回发事件的?>中曾提出一个疑问,如何得到引起页面PostBack的控件?通过阅读Page类的源码,误打误撞,无意中看到了__EVENTTARGET和__E ...

  3. [转]深入理解 __doPostBack

    在我的随笔<Page,你是怎样处理回发事件的?>中曾提出一个疑问,如何得到引起页面PostBack的控件?通过阅读Page类的源码,误打误撞,无意中看到了__EVENTTARGET和__E ...

  4. 【ASP.NET】 【防止连续多次点击提交按钮 导致页面重复提交】

    最近做项目遇到了这样的情况: 公司网络比平常慢了不少,在点击保存按钮提交页面后需等待挺长的一段时间,忍不住手贱点多了几次,当提交完成后发现数据库语句执行异常. 两种验证方式: 第1种: aspx页面按 ...

  5. 收藏:asp.net

    CSDN =================================================== isual Studio 2008简体中文试用版(90天)变成永久正式版的两种方法  ...

  6. ASP.NET WebForm Best Practice 之PostBack

    关于PostBack,我曾经也写过一篇博客<深入理解 __doPostBack>.在这篇文章里有对PostBack进行了一些研究,现在看来研究的还是不够深入.不过从原理上来说,ASP.NE ...

  7. 深入理解asp.net中的 __doPostBack函数

    前段时间做一个.net网站的时候,用到了模拟前端按钮刷新updatePanel进行局部刷新的时候,遇见了这个问题,当时没顾上记下来,查看网上资料,记下来留着以后查看. 很早以前,当我刚接触asp.NE ...

  8. ASP.Net中OnBeforeUnLoad事件中调用__doPostBack不起作用?

    我想当页面离开时,调用__doPostBack,但是服务器端总是得不到PostBack通知. function test() {    __doPostBack('Button1',''); }   ...

  9. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  10. stream流对象的理解及使用

    我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...

最新文章

  1. 什么是RNA-Seq (RNA Sequencing)
  2. 第九章:路由网关(Zuul)的使用
  3. 也谈游戏--魔兽和星际的区别
  4. 多表查询中的一些概念
  5. [蓝桥杯][2014年第五届真题]稍大的串(STL)
  6. python程序、画一个笑脸_如何使用canvas画一个微笑的表情(代码示例)
  7. java线程立刻执行_Java 线程调用start()后会立即执行run()方法吗?
  8. 删除顽固文件夹cygwin的方法,挺折腾的
  9. 萌新向Python数据分析及数据挖掘 第二章 pandas 第二节 Python Language Basics, IPython, and Jupyter Notebooks...
  10. Android使用Glide框架加载网络图片(解决无报错图片不显示问题)
  11. 根据生日计算年龄 java_Java 根据出生日期获得年龄
  12. 国内自主研发的游戏引擎一览
  13. 良心安利动物 恐龙unity3d模型素材网站
  14. Python爬取下载m3u8视频,原来这么简单!
  15. 机器学习之手写数字图片数据处理及识别
  16. 6软硬约束下的轨迹优化
  17. 【vs2019】调试介绍
  18. 摸鱼宝典(一)——贪吃蛇游戏改版:贪吃龙 · 双龙戏珠小游戏(Python)
  19. 程序的与时俱进之一——面向接口编程
  20. R语言绘制SCI论文中常见的箱线散点图,并自动进行方差分析计算显著性水平

热门文章

  1. colab 数据集_Google Colab上的YOLOv4:轻松训练您的自定义数据集(交通标志)
  2. Mybatis Sql 大于号小于号不兼容
  3. nosql第一章课后习题
  4. 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点...
  5. 获取Map集合中数据的方法
  6. 在思科路由器上配置SSH登录
  7. 建立网络安全新生态,网络态势感知至关重要
  8. dell r730 xd 安装vmware esxi 5.5 u1
  9. 我和linux的第十三天
  10. linux下使用hash_map及STL总结