【问题标题】:Multiple Concurrent Postbacks when using UpdatePanels使用 UpdatePanel 时的多个并发回发
【发布时间】:2010-12-24 09:49:04
【问题描述】:

这是我为演示我的问题而构建的示例应用程序。一个单独的 aspx 页面,上面有以下内容:

<form id="form1" runat="server">
    <asp:ScriptManager runat="server" />
    <asp:Button runat="server" ID="btnGo" Text="Go" OnClick="btnGo_Click" />
    <asp:UpdatePanel runat="server">
        <ContentTemplate>
            <asp:TextBox runat="server" ID="txtVal1" />
        </ContentTemplate>
    </asp:UpdatePanel>
</form>

然后,在后面的代码中,我们有以下内容:

protected void btnGo_Click(object sender, EventArgs e)
{
    Thread.Sleep(5000);

    Debug.WriteLine(string.Format("{0}: {1}", DateTime.Now.ToString("HH:MM:ss.fffffff"), txtVal1.Text));

    txtVal1.Text = "";
}

如果您运行此程序并多次单击“开始”按钮,您将在“输出”窗口中看到多个调试语句,显示多个请求已被处理。这似乎与更新面板的记录行为相矛盾(即,如果您在处理面板时发出请求,则第一个请求将被终止并处理当前请求)。

无论如何,重点是我想修复它。显而易见的选择是在第一次按下后使用 Javascript 禁用按钮,但这让我觉得难以维护,我们可能在很多屏幕上遇到同样的问题,如果有人重命名按钮,它很容易被破坏。

你有什么建议吗?也许我可以在 Global.asax 的 BeginRequest 中做些什么来检测重复请求? UpdatePanel 上是否有一些设置或功能可以阻止它这样做,或者 AjaxControlToolkit 中的某些东西会阻止它吗?

【问题讨论】:

    标签: javascript asp.net ajax asp.net-ajax updatepanel


    【解决方案1】:

    制作一个从 asp Button 继承的自定义控件,并具有禁用和启用自身的脚本。波纹管未经测试,但只是一个起点。

    public class SafeButton : System.Web.UI.WebControls.Button{
    public SafeButton()
    {
        OnClientClick = "javascript to disable this button goes here";
        ScriptManager.RegisterStartupScript(this, this.GetType(), "keyforthis", "javascript to enable this button goes here", true);
    }
    

    【讨论】:

      【解决方案2】:

      第一个解决方案

      您可以通过设置(在按钮的标记中)防止用户进行多次点击

      OnClientClick="this.disabled = true;" 
      

      并设置此属性

      UseSubmitBehavior="false"
      

      这将在单击按钮后禁用该按钮。您不需要启用该按钮,它会在从回发返回后自行启用。 'UseSubmitBehavior' 将关闭默认的提交行为并允许提交,尽管按钮被禁用。

      以上方案仅适用于按钮控件,并非所有平台都支持seeMSDN 支持平台。


      第二种解决方案:

      这将提交表单,如果 10 毫秒后页面在客户端上仍然可用,则按钮\控件将禁用。

      编写一个javascript函数

      <script language="javascript" >
      
      function preventMultipleClicks(a){
         window.setTimeout(function() { a.disabled=true; }, 10)
         return true;
      }
      
      </script>
      

      然后在按钮或回发控件的OnClientClick属性中调用

      OnClientClick="preventMultipleClicks(this);"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 2014-08-21
        相关资源
        最近更新 更多