在IE11中未定义__doPostBack

13
使用现成的asp HyperLink控件时,在IE 11中会出现错误SCRIPT5009: __doPostBack未定义,链接到这里: http://msdn.microsoft.com/en-us/library/ie/xyf5fs0y(v=vs.94).aspx。 在F12开发工具控制台窗口中看到此情况。是否有人遇到过这个问题,是否有解决方法?这是一个生产环境。
编辑: 应用热修复http://support.microsoft.com/kb/2600088对我无效,并且Windows 8上的IE 10正常运行。 Scott Hanselman有一篇更新的文章提供更新信息。http://www.hanselman.com/blog/IE10AndIE11AndWindows81AndDoPostBack.aspx 我将尝试这些修复并更新该问题,但似乎只存在于Windows 8.1和IE11。

4
可能是重复的问题:IE10 SCRIPT5009: '__doPostBack' is undefined - Mgetz
3
新的浏览器....同样的漏洞 - Mgetz
我同意这似乎是一个重复的问题。我会尝试热修复并确认。 - personaelit
1
另一个可能的重复链接:https://dev59.com/aWMl5IYBdhLWcg3wV1wE - personaelit
这个问题不应该被删除……只需要关闭它,因为它会重定向到正确的解决方案,尽管浏览器版本发生了变化。 - Mgetz
显示剩余4条评论
9个回答

25

在为同一个问题苦苦挣扎了几天后,我们找到了这个解决方案:

http://connect.microsoft.com/VisualStudio/feedback/details/806542/fix-internet-explorer-11-not-detected-correctly-by-net-4-0-framework-when-custom-browser-files-are-used

将一个新的.browser文件添加到App_Browsers文件夹中;我们将该文件命名为“IE11.browser”,如果App_Browsers文件夹不存在,则创建它。

然后,我们只需将上面链接中的内容复制到新创建的文件中,重新部署,现在就没有_doPostBack错误了。

文件的主体如下:

<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>

我们不需要将我们的 .Net 版本从 4 升级到 4.5,现在一切都能正常工作了。

希望这能帮助遇到同样烦人问题的人!


1
我也遇到了同样的问题。谢谢!我在报表查看器控件上遇到了这个问题(只是说一下)。 - Gerry Whitworth
1
这对我有用。谢谢! - Apollo
升级到FW 4.5.2会导致当前部署的应用程序出现破坏性更改而产生新问题,但我喜欢这个解决方案,很快就会尝试。非常感谢! - AFract
与其使用上述的修复方法,对于那些无法安装FW4.5.2的人来说,可以使用微软针对IE11发布的热补丁:http://support.microsoft.com/kb/2836939/。 - AFract
这个方法非常有效!不过我必须对它进行一些更改,因为显然一些IE11浏览器在Trident和rv之间有一些东西。我将useragent匹配中的7.0; rv更改为7.0;(.*?)rv - Stryner
太棒了 - 谢谢你。又发现一个缺陷,这也是讨厌IE的原因之一。 - deebs

7
把下面的脚本放在你的主页面上肯定会解决它。我曾经遇到过类似的问题,然后它得到了修复。
<script runat="server">

protected override void OnInit(EventArgs e)
{
Page.ClientTarget = "uplevel";
base.OnInit(e);

}
</script> 

4
就我个人而言,这是唯一在我的主机上有效且我无法控制环境的解决方案。在我的情况下,.browser文件对我没有帮助。需要知道的是,如果你这样做,就相当于在网站中硬编码支持JavaScript,因此不支持JavaScript的旧浏览器将不再像以前那样正常运行。在我的情况下,这是可以接受的。 - Nathan Pond

3

3
简要背景介绍:这个问题可能已经为我解决了,但当我的服务器上.NET 4.5安装失败时,由于一些晦涩的RSA问题,我打开了潘多拉魔盒。长话短说,这需要两次新服务器构建和三周的时间。 - personaelit
1
@Jim 我们也遇到了同样的问题。仅仅使用UseCookies来创建会话和身份验证模式是不起作用的。你必须安装全新版本的框架!!然而,在使用IE11和框架4进行开发模式时,它可以完美地工作。 - DipakRiswadkar
3
对于那些无法安装FW4.5.2的人,可以使用微软IE11的一个热修复补丁:http://support.microsoft.com/kb/2836939/ - AFract
根据上面的评论,在计划在生产服务器上安装时,安装 .net 4.5 应该非常谨慎考虑。 - TheLegendaryCopyCoder
1
@AFract,在尝试了很多解决方案后,你在评论中提供的链接解决了我的问题。谢谢! - Diablo

1
在我们的服务器上安装Framework 4.5需要通过红色审批程序并填写表格,所以这是我所做的: 去网站:http://blogs.telerik.com/aspnet-ajax/posts/13-12-19/how-to-get-your-asp.net-application-working-in-ie11 寻找下载自定义 .browser 文件与 IE11 修复程序的链接。 将 telerik_ie11_browser_file_fix.zip 保存到您的计算机上并解压缩 Telerik_IE11_fix.browser。 将 Telerik_IE11_fix.browser 复制到目标服务器路径 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Browsers。 在服务器上运行以下命令(在 hanselman 修复博客上看到): cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319(或您使用的任何框架版本) 运行 C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regbrowsers –i 在服务器上运行 iisreset。

将浏览器修复程序放入我的C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\Browsers和C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Browsers文件夹中,然后重新启动IIS即可解决我的问题。 - TheLegendaryCopyCoder

0

问题在于,由于用户代理已更改,Asp.net不将IE11识别为现代浏览器,对于处于相同情况的任何人,唯一的解决方案是添加一个setTimeout。

而不是使用以下代码段

__doPostBack('ButtonPostBack', "");   

请使用这个。
setTimeout(function () { __doPostBack('ButtonPostBack', ""); }, 1);

0

基本上是这样的,有两个缺失的HTML隐藏元素“eventtarget”和“eventargument”,以及一个缺失的函数“__doPostBack”。

这些在DOM中缺失。

我尝试了所有列出的修复方法,但都没有起作用。然而,使用jQuery和JavaScript的组合,有一种不显眼的解决方案。在文档准备就绪时将此添加到您的JavaScript中,您就可以开始了:

if ($('#__EVENTTARGET').length <= 0 && $('#__EVENTARGUMENT').length <= 0) {
  $('#YOUR_ASPNET_FORMID').prepend('<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /><input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />');
}

if (typeof __doPostBack == 'undefined') {
  __doPostBack = function (eventTarget, eventArgument) { object
    var theForm = document.forms['YOUR_ASPNET_FORMID'];
    if (!theForm) {
      theForm = document.YOUR_ASPNET_FORMID;
    }
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
      theForm.__EVENTTARGET.value = eventTarget;
      theForm.__EVENTARGUMENT.value = eventArgument;
      theForm.submit();
    }
  };
}

我知道安装4.5会修复一些问题,我强烈建议这样做。 但是,如果像我一样在使用内置 .net 4 的企业公共网站上工作,并且有一个 CMS 系统,则这可能是一个更简单的解决方案,而不是通过更新您的平台可能引入新错误。


1
请不要这样做。IE11由于用户代理的更改,未被Asp.net识别为现代浏览器。如果您想在不在服务器上安装.net 4.5的情况下解决此问题,则需要在~/app_browsers中包含browsercap文件,以便正确识别IE11。Scott Hanselman的博客提供了所有信息:http://www.hanselman.com/blog/BugAndFixASPNETFailsToDetectIE10CausingDoPostBackIsUndefinedJavaScriptErrorOrMaintainFF5ScrollbarPosition.aspx(如果您不使用nuget,请从nuget包中复制.browser文件)。 - Lodewijk

0

对于我来说,热修复都没有起作用,也无法更新ie.browser文件。 我使用的是Windows Server 2008 R2。

然而唯一有效的解决方案(除了升级到.net 4.5之外)是在此线程中添加@vishal建议的脚本


0
在Windows 2008上使用IIS 7.5,将浏览器配置文件添加到App_Browsers(请参见上面的XML)可用于IE 11。在以前的网站上,我们做了其他事情,但这种方法更简单。

0
我发现一个页面缺少带有runnat='server'的表单标签。如果你的页面没有这个标签,那么postback将无法传回控件并正确触发任何后端代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接