在使用IE10标准模式的UpdatePanel中单击HtmlButton会导致双重XMLHttpRequest回发



我们有一个.NET 4.0 WebForms应用程序。一个页面有一个UpdatePanel,其中包含一些HtmlButton控件。当服务器在.NET 4.0上运行时,此操作正常。

当服务器升级到4.5时,我们注意到点击按钮会挂起浏览器。微调器将显示,用户的会话基本上被锁定,直到调用超时。

在浏览器开发工具(F12)的"网络"选项卡中,我们观察到:

  • IE10使用标准文档模式:对服务器进行两次调用。第一个没有内容,结果为"(中止)"。Fiddler报告内容长度不匹配。第二个呼叫直到超时才会返回
  • IE10 Compat View,Doc Mode IE7标准:只对服务器进行一次调用。一切都很好
  • 任何其他模式下的IE10(以及IE9)对服务器进行2次调用,第一次中止,第二次挂起/挂起
  • Chrome:对服务器进行了两次调用,但第二次调用成功

对运行.Net 4.0的服务器执行同样的观察显示出类似的双重调用,但在任何情况下第二次调用都没有挂起。

我通过创建一个新的默认.Net 4.5 WebForms应用程序来重新创建这种双重调用行为(除了挂起的第二次调用),该应用程序具有UpdatePanel、Literal和HtmlButton,如下所示:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:Literal ID="myliteral" runat="server"></asp:Literal>
        <button id="htmlbtn" runat="server" OnServerClick="htmlbtn_Click"></button>
    </ContentTemplate>      
</asp:UpdatePanel>

ServerClick事件只是将当前时间放在Literal中。

这重新创建了双柱行为。我还尝试使用其他类型的按钮,如ImageButton,它们只发出一个调用就可以正常工作。

有人知道这里发生了什么吗?有什么方法可以避免使用HtmlButton的双重帖子吗?我假设这两个呼叫与挂起的第二个呼叫有关,但这可能是一个糟糕的假设。

事实证明,他们对每个部分页面请求都进行了一些jQuery绑定,这些请求在再次绑定之前没有解除绑定。

在jQuery的$(document).ready()过程中,我设置了到各种元素的绑定。此函数是在UpdatePanels导致的部分回调期间调用的。因此,在某些情况下,在再次设置绑定之前,我需要做如下操作:$('#ctrl').ubind();(可能有一种方法可以检查绑定是否存在,并仅在必要时添加它。)

页面上还有一个使用jQuery autoresize插件的文本区域。初始化后,插件会在页面外添加一个克隆文本区域,用于计算文本高度。在每个部分页面更新中,都会创建一个新的文本区域。使用Chrome的开发工具可以发现这个问题,因为我可以看到DOM正在实时更改。我添加了一些脚本来检查这些现有的文本区域并清理它们。

最新更新