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.NET\Framework64\v4.0.30319\CONFIG\Browsers文件夹

再次尝试。

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

 

posted @ 2019-07-17 14:41  Nina  阅读(571)  评论(0编辑  收藏  举报