1

我们有一个 .NET 4.0 WebForms 应用程序。一页有一个包含一些 HtmlButton 控件的 UpdatePanel。当服务器在 .NET 4.0 上运行时,这可以正常工作。

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

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

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

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

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

<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 的双重发布?我假设这两个电话与挂起的第二个电话有关,但这可能是一个糟糕的假设。

4

1 回答 1

0

事实证明,对于每个在再次绑定之前没有被解除绑定的部分页面请求,它们是一些 jQuery 绑定。

在 jQuery 的 $(document).ready() 期间,我设置了对各种元素的绑定。此函数在由 UpdatePanels 引起的部分回发期间被调用。因此,在某些情况下,在再次设置绑定之前,我需要做以下类似的事情: $('#ctrl').unbind(); (可能有一种方法可以检查绑定是否存在,并且仅在必要时添加它。)

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

于 2013-07-24T07:25:57.017 回答