• _doPostBack用法总结


    转载在以下两篇博客:

    http://www.cnblogs.com/yongtaiyu/archive/2011/05/13/2045746.html

    http://www.cnblogs.com/Fooo/archive/2009/08/19/1549908.html

    今天写ajax程序时,需要重新从后台加载数据,所以用了__doPostBack方法。 __doPostBack并不是我自己写的方法,是由asp.net 自己加入页面中的方法。我们运行Asp.net程序后,会在生成的html源码中看到__doPostBack方法,其代码如下:

    <script type="text/javascript">
    //<![CDATA[
    var theForm = document.forms['aspnetForm'];
    if (!theForm) {
        theForm = document.aspnetForm;
    }
    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
    //]]>
    </script>
    

    __doPostBack说明:     __doPostBack可以实现客户端控件调用服务器端控件的响应。 __doPostBack方法的格式为: __doPostBack(eventTarget,eventArgument)    参数:  eventTarget:是要触发的服务器控件的客户端ID          eventArgument:参数
    这个两个值在后台可以通过下边方法得到:     Request["__EVENTTARGET"]     :获取得到引发页面PostBack的控件ID     Request["__EVENTARGUMENT"]: 获取参数。

    例子,回发UpDataPanel,通过参数获取资料。 1)首先调用doPostBack触发回发: 

    __doPostBack('ctl00_ContentPlaceHolder1_upModulePower', 'jsPostback')

     说明:

      ctl00_ContentPlaceHolder1_upModulePower:是加了母版页后的生成的客户端ID。

      jsPostback:用于判断是不是通过js控件触发的回发。因为UpDatePanel中会有其它服务器控件解发的回发,所以用此参数加以区分。

     2) 在后台PageLoad中得到参数,并取数据。

    //判断是否是js触发的回发  if (Request["__EVENTARGUMENT"== "jsPostback") {     //此处调用相关后台方法     //…… }

      其它问题:     但是在我们调用__doPostBack函数时,有些时候调用这个函数会出现"对象不存在"的脚本错误? 那是因为Html里面没有__doPostBack函数体,一般在拖放那些有自动回传功能的控件时,当把他的autoPostback属性设为True,在运行的时候系统会自动添加__doPostback函数体。当然最直接的办法就是添加一个LinkButton。在页面中加如 LinkButton ,页面就会在页面中加载POSTBACK所需的JS,然后把其Text属性设为空,切记不要设 Visible属性,因为如果Visible=false,在翻译成Html时,直接就忽略LinkButton的存在了

    在.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事件中写上onclick=”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,写入onclick="__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" value="" /> 
    
    <input type="hidden" value="" />
    
  • 相关阅读:
    Oracle X$ View:X$KJMSDP
    explore my oracle support using firefox 3.6
    EnterpriseDB Migration 迁移工具使用测试(2)
    What's preconnect.svc in 11g RAC?
    Mysql:语法:注释
    Mysql:命令选项、配置选项、(全局、会话)系统变量、状态变量:总揽
    Mysql:简单“破解”SQLyog Enterprise 812 Trial
    Mysql:函数之一:information functions
    Mysql:语法:虚拟表DUAL
    VC++.Net2005的一些常识(转)
  • 原文地址:https://www.cnblogs.com/wphl-27/p/5335637.html
Copyright © 2020-2023  润新知