【问题标题】:__doPostBack is undefined in IE11__doPostBack 在 IE11 中未定义
【发布时间】:2013-11-23 19:23:00
【问题描述】:

使用现成的 asp HyperLink 控件,IE 11 给出错误 SCRIPT5009: __doPostBack is undefined with a link to here: http://msdn.microsoft.com/en-us/library/ie/xyf5fs0y(v=vs.94).aspx

这可以在 F12 devtools 控制台窗口中看到。

有没有人遇到过这个问题,有解决办法吗?这是一个生产环境。

编辑: 应用修补程序 http://support.microsoft.com/kb/2600088 对我不起作用,Windows 8 上的 IE 10 工作正常。

Scott Hanselman 最近发表了一篇文章,其中包含更新的信息。 http://www.hanselman.com/blog/IE10AndIE11AndWindows81AndDoPostBack.aspx 我会尝试这些修复并更新这个问题,但这似乎与 Windows 8.1 和 IE11 隔离。

【问题讨论】:

标签: asp.net windows-8.1 internet-explorer-11


【解决方案1】:

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

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,现在一切正常。

希望这可以帮助遇到同样令人沮丧的问题的人!

【讨论】:

  • 也为我工作。谢谢,我在报告查看器控件时遇到了这个问题{只是说}
  • 这对我有用。谢谢!
  • 升级到 FW 4.5.2 会导致新问题,因为对我的客户当前部署的应用程序进行了重大更改,我喜欢这个解决方案并将很快尝试。非常感谢!
  • 除了上面的修复,对于那些无法安装FW4.5.2的人,有一个针对IE11的MS修复:support.microsoft.com/kb/2836939
  • 这创造了奇迹!不过我不得不对其进行一些更改,因为显然某些 IE11 浏览器在 Trident 和 rv 之间有一些东西。我将用户代理匹配中的7.0; rv 更改为7.0;(.*?)rv。
【解决方案2】:

将下面的脚本放在您的母版页中肯定会解决它。我有一个类似的问题,它得到了解决。

<script runat="server">

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

}
</script> 

【讨论】:

  • 不管怎样,这是在我无法控制环境的主机上为我工作的唯一解决方案。 .browser 文件对我没有帮助。只要知道,如果您这样做,并且将 javascript 支持硬编码到您的站点中,那么不支持 javascript 的旧浏览器将不再像以前那样运行。就我而言,这是可以接受的。
【解决方案3】:

在您的 Web 服务器上安装 .NET Framework 4.5 应该可以解决它。

http://www.microsoft.com/en-gb/download/details.aspx?id=30653

或者,如果您无法安装 .NET Framework 4.5,则有一个适用于 IE11 的 Microsoft 修补程序:http://support.microsoft.com/kb/2836939(感谢 @Afract 的评论)

【讨论】:

  • 一些背景故事——这可能会为我解决这个问题,但是当 .NET 4.5 安装由于我的服务器上一些模糊的 RSA 问题而失败时,我打开了潘多拉的盒子。长话短说,它需要两个新的服务器构建和我三周的生命。
  • @Jim 它也发生在我们身上。仅使用 UseCookies 进行会话和身份验证模式是行不通的。您必须安装全新版本的框架!但是 - 它在带有框架 4 的 IE11 的开发模式下完美运行
  • 无法安装FW4.5.2的朋友,有针对IE11的MS hotfix :support.microsoft.com/kb/2836939
  • 基于上面的 cmets,在计划在生产服务器上安装时应该非常仔细地考虑安装 .net 4.5。
  • @AFract,在尝试了很多解决方案后,您在 cmets 中的链接解决了我的问题。谢谢
【解决方案4】:

在我们的服务器上安装 Framework 4.5 需要涉足繁文缛节并填写表格,所以这就是我所做的:

转到网站:http://blogs.telerik.com/aspnet-ajax/posts/13-12-19/how-to-get-your-asp.net-application-working-in-ie11

找到下载带有 IE11 修复程序的自定义 .browser 文件的链接。

将 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\浏览器文件夹并重新启动 IIS 为我解决了这个问题。
【解决方案5】:

基本上发生了什么是缺少 2 个 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 系统的企业公共网站上工作,那么这可能只是一个更简单的解决方案,而不是可能引入因更新您的平台而产生的新错误。

【讨论】:

  • 请不要这样做。由于用户代理发生了变化,Asp.net 无法将 IE11 识别为现代浏览器。如果您想在服务器上不安装 .net 4.5 的情况下解决此问题,则需要在 ~/app_browsers 中包含 browsercap 文件,以便正确识别 IE11。 Scott Hanselman 的博客包含所有信息:hanselman.com/blog/…(如果您不使用 nuget,只需从 nuget 包中复制 .browser 文件即可)。
【解决方案6】:

在带有 IIS 7.5 的 Windows 2008 上将浏览器配置文件添加到 App_Browsers(有关 XML,请参见上文)适用于 IE 11。在以前的网站上,我们做了其他事情,但这要简单得多。

【讨论】:

    【解决方案7】:

    没有一个修补程序对我有用,也没有更新ie.browser 文件。 我在 Windows Server 2008 R2 上。

    唯一可行的解​​决方案(除了升级到 .net 4.5)是在此线程中添加 the script suggested by @vishal。

    【讨论】:

      【解决方案8】:

      我发现一个页面缺少带有 runnat='server' 的表单标签。如果这不在您的页面上,则回发将无法传回控件并正确触发后面的任何代码

      【讨论】:

        【解决方案9】:

        由于用户代理发生了变化,Asp.net 无法将 IE11 识别为现代浏览器, 对于处于相同情况的任何人,对我来说,100 条建议中唯一的解决方案是 添加一个 setTimeout

        而不是使用下面的片段

        __doPostBack('ButtonPostBack', "");   
        

        用这个

        setTimeout(function () { __doPostBack('ButtonPostBack', ""); }, 1);
        

        【讨论】:

          猜你喜欢
          • 2011-03-29
          • 2013-02-22
          • 2016-06-26
          • 2013-12-16
          • 2013-06-29
          • 1970-01-01
          • 1970-01-01
          • 2021-11-13
          • 2018-07-18
          相关资源
          最近更新 更多