zoukankan      html  css  js  c++  java
  • asp.net关于页面不回发,不生成__doPostBack方法问题的完美解决方案--ZT

    原文:http://www.sufeinet.com/thread-4564-1-1.html

    这个问题我相信有不少人见过,就是使用系统的分页功能时,或者是使用系统控件,都会有一个回发的功能,这个功能是asp.net自动管理的,就是为了和我们后台的Cs代码连接起来,
    但是有时候这个方法并不会生成,正常情况下在页面的Form下面都会生成如下代码

    [C#] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    <script type="text/javascript">
    //<![CDATA[
    var theForm = document.forms['form1'];
    if (!theForm) {
        theForm = document.form1;
    }
    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
    //]]>
    </script>


    但是我发现在一些电脑上,也不知道是什么情况就是没有这两个方法,然后就单击按钮或者是分页时就提示如下
    <ignore_js_op> 
    这很明显就是 __doPostBack方法不存在,
    ReferenceError:__doPostBack is not defined
    ReferenceError:__doPostBack is not defined

    我就奇怪了,为什么呢?
    而且在这个电脑上的所有浏览器都有一样,IE678 火狐,Google,等都是同样的效果。
    着实让人郁闷,所以来博客园请教一下大家看看这种问题应该怎么解决了,
    我到是想到一个比较次的方法,只能是在没有找到解决方案之后应的急
    代码如下

    [C#] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <script type="text/javascript">
           function SetdoPostBack() {
               var html = document.body.innerHTML;
               if (html.toLowerCase().indexOf("dopostback") < 0) {
                   var sb = "<script type="text/javascript">";
                   sb = sb + "//<![CDATA[";
                   sb = sb + "var theForm = document.forms['form1'];";
                   sb = sb + "if (!theForm) {";
                   sb = sb + "    theForm = document.form1;";
                   sb = sb + "}";
                   sb = sb + "function __doPostBack(eventTarget, eventArgument) {";
                   sb = sb + "    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {";
                   sb = sb + "        theForm.__EVENTTARGET.value = eventTarget;";
                   sb = sb + "        theForm.__EVENTARGUMENT.value = eventArgument;";
                   sb = sb + "        theForm.submit();";
                   sb = sb + "    }";
                   sb = sb + "}";
                   sb = sb + "//]]>";
                   sb = sb + "</script>";
                   document.write(sb);//大家不要管这个,这只是一个输出,正常情况下我是添加到一个Div里的,这里是为了方便查看
               }
       }
       setTimeout('SetdoPostBack()', 2000);//2秒之后开始检查



    面的方法要用的话还需要加上两个属性不光是这两个方法没有生成,
    __VIEWSTATE等几个hidden控件,因为这个是自动生成的。可这些的生成规则实在是不好处理,不过我发现只要VIEWSTATE有的话另外的两个,只要是生成了,值为Null也不会影响的。
    不过这也只是应个急。
    还没有想到更好的办法。
    希望大家帮忙啊。
    根据我的分析,会不会是在某些Ip上在运营商或者是什么地方给屏蔽了一些东西,才使页面不会生成这个方法的。
    如果说是浏览器问题那可以排除了,因为我能测试的都测试了,
    这问题也不是全部都有,就是有那么几个用户的电脑。
    。。。。。。。。

    分析


       出现这种问题的关键是什么呢?
    我经过查证和咨询总结出来了答案
    原因有以下几点,
    1.有可能是使用net4.0+iis6之后没有打补丁。
    解决办法
    在IE10中登录我公司的一个网站时,点击其它菜单,页面总会自动重新退出到登录页,后检查发现,IE10送出的HTTP头,和.AUTH Cookie都没问题,但使用表单验证机制(FormsAuthentication)却无法判断该用户已登入,保存的Session总会丢失.     后查实这是ASP.NET 2.0,3.5和4.0的Bugs,因这些版本无法识别IE10的User-Agent标头字符串,所以无法识别用户浏览器的版本,从而导至了ASP.NET的特定功能失效,认为游览器不支持Cookies功能,不处理与Cookie相关的程式码等,从而在浏览器中不保存服务器返回的Session标识,造成丢失等.
          这个问题早经微软官方确认,是IE10的一个Bug,也发布了两个HOTFIX专门用来修复这个问题,各位如遇到同样的问题,可参考以下说明:


    2.简单的解决方法是,在网站根目录,新增一个浏览器定义文件(browser definition file)
         步骤如下:
         1.添加一个"App_Browsers"文件夹
         2.添加一个"*.browser"后缀的文件,如IE10.browser.
         3.添加文件内容如下:

    [C#] 纯文本查看 复制代码
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    <browsers> 
     
           <browser refID="Default"
     
              <capabilities><!-- To avoid wrong detections of e.g. IE10 --> 
     
                 <capability name="cookies" value="true" /> 
     
                <capability name="ecmascriptversion" value="3.0" /> 
     
            </capabilities> 
     
            </browser> 
     
           </browsers>
    设定完成,问题即可解决,本方法同时也适用于处理asp.net中控件事件回发操作无效问题。
    这是网上最常见的一种了,
    不过这个方法其实不需要打补丁,只需要设置这App_Browsers个文件夹就行了

    我亲自测试过是可以解决问题的
    还有一种解决方法就是换控件


    这里方法如下
    你还在用ASP.NET Web Forms吗?如果在用的话,你可要小心了:

    千万不要使用LinkButton控件!

    为什么呢?
    请看ASP.NET代码:

    [C#] 纯文本查看 复制代码
    01
    <asp:LinkButton Text="Post" runat="server" id="lbPost"/>


    请看运行时的页面HTML代码:

    [C#] 纯文本查看 复制代码
    01
    <a id="MainContent_lbPost" href="javascript:__doPostBack('ctl00$MainContent$Post','')">Post</a>


    问题来了!根据我们遇到的实际情况,某个未知的软件会造成在点击"Post"链接时Javascript代码不能正常执行(可能这个软件是出于安全考虑),引发“WebForm_PostBackOptions is not defined"异常。
    这个问题困扰了我们一个多月,问题是多个用户反馈的。而我们无法重现这个问题,解决起来很棘手,最后,一闪而过的想法才让我们猜测到这个原因。
    解决方法
    弃用asp:LinkButton,改用asp:Button。
    该方法已经通过验证,之前遇到这个问题的用户已经确认问题已解决。
    由于无法重现这个问题,我们无法找出究竟是哪个未知软件引起的。
    小结
    问题很简单,解决方法也很简单,但这个问题的现象不具独特性,很费周折,网上一搜索,满网尽是“WebForm_PostBackOptions is not defined",当时找到的觉得稍微有点价值的是WebResource.axd动态压缩可能会引起这个问题,却让我们误入歧途,浪费了很多时间。在几乎绝望,准备用ASP.NET MVC重写整个页面时,问题的线索一下子蹦了出来。那种感觉你懂的!
    也许从外人看来程序员性格内向、缺乏情趣,可是他们没有看到程序员在解决问题时眼中放出的光芒,他们也不知道程序员内心所经历的精彩世界!
    让他们知道吧,用博客写出程序员的精彩世界!

    参考文章:
    http://www.cnblogs.com/fanvy/archive/2013/02/07/2908769.html
    http://www.cnblogs.com/cmt/archi ... is_not_defined.html

    百度查阅资料得知,这是微软NET环境下的一个BUG,官方已经发布了新的补丁包,可直接通过下载最新Framwork补丁得到修改。

      除此办法以外,还可以在项目中直接修改,方法如下:

      1、项目根目录下,建App_Browsers文件夹

      2、在文件夹中新建文件ie.browser文件,文件内容粘贴如下内容:

    复制代码
    <browsers>
      <browser id="IE11" parentID="Mozilla">
        <identification>
          <userAgent match="Trident/7.0; rv:(?'version'(?'major'd+)(.(?'minor'd+)?)(?'letters'w*))(?'extra'[^)]*)" />
          <userAgent nonMatch="IEMobile" />
        </identification>
        <capture>
          <userAgent match="Trident/(?'layoutVersion'd+)" />
        </capture>
        <capabilities>
          <capability name="browser"              value="IE" />
          <capability name="layoutEngine"         value="Trident" />
          <capability name="layoutEngineVersion"  value="${layoutVersion}" />
          <capability name="extra"                value="${extra}" />
          <capability name="isColor"              value="true" />
          <capability name="letters"              value="${letters}" />
          <capability name="majorversion"         value="${major}" />
          <capability name="minorversion"         value="${minor}" />
          <capability name="screenBitDepth"       value="8" />
          <capability name="type"                 value="IE${major}" />
          <capability name="version"              value="${version}" />
        </capabilities>
      </browser>
      <!-- Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11,0) like Gecko -->
      <browser id="IE110" parentID="IE11">
        <identification>
          <capability name="majorversion" match="11" />
        </identification>
    
        <capabilities>
          <capability name="ecmascriptversion"    value="3.0" />
          <capability name="jscriptversion"       value="5.6" />
          <capability name="javascript"           value="true" />
          <capability name="javascriptversion"    value="1.5" />
          <capability name="msdomversion"         value="${majorversion}.${minorversion}" />
          <capability name="w3cdomversion"        value="1.0" />
          <capability name="ExchangeOmaSupported" value="true" />
          <capability name="activexcontrols"      value="true" />
          <capability name="backgroundsounds"     value="true" />
          <capability name="cookies"              value="true" />
          <capability name="frames"               value="true" />
          <capability name="javaapplets"          value="true" />
          <capability name="supportsCallback"     value="true" />
          <capability name="supportsFileUpload"   value="true" />
          <capability name="supportsMultilineTextBoxDisplay" value="true" />
          <capability name="supportsMaintainScrollPositionOnPostback" value="true" />
          <capability name="supportsVCard"        value="true" />
          <capability name="supportsXmlHttp"      value="true" />
          <capability name="tables"               value="true" />
          <capability name="supportsAccessKeyAttribute"    value="true" />
          <capability name="tagwriter"            value="System.Web.UI.HtmlTextWriter" />
          <capability name="vbscript"             value="true" />
        </capabilities>
      </browser>
    </browsers>
    复制代码

      3、重启IIS尝试是否修正错误,如未修正,把上述代码粘贴到%WinDir%Microsoft.NETFramework64v4.0.30319CONFIGBrowsers文件夹

    再次尝试。

      4、如果还不行,请安装NET插件:http://www.microsoft.com/zh-cn/download/details.aspx?id=28936

  • 相关阅读:
    用代码操作文件(文件夹)
    文件上传
    用ajax、PHP、session做购物车
    ajax返回数据类型为JSON数据的处理
    Hadoop机架感知
    Linux 克隆虚拟机以及克隆之后引起的“Device eth0 does not seem to be present, delaying initialization”问题解决
    克隆之后一键修改IP、删除Mac地址、修改主机名(未测试成功只是思路)
    关于Hadoop的杂乱无章(续更)
    使用CentOS6.8搭建Hadoop集群
    CentOS6.8卸载与安装yum
  • 原文地址:https://www.cnblogs.com/Nina-piaoye/p/11200930.html
Copyright © 2011-2022 走看看