【问题标题】:How to prevent double submit with jQuery in ASP.NET app with UpdatePanels如何使用 UpdatePanels 在 ASP.NET 应用程序中防止使用 jQuery 双重提交
【发布时间】:2012-07-05 18:03:12
【问题描述】:

我有一个有时响应缓慢的 Intranet ASP.NET 应用程序。我的要求是防止重复提交,并且最好向用户提供表单已经提交的反馈。

我发现的示例展示了如何禁用提交按钮,但这还不够,因为在我的应用中可能会发生提交:

  • 来自提交按钮。
  • 从任何具有 AutoPostBack = true 的控件(使用 javascript AFAIK 提交)。
  • 从 UpdatePanel 中的上述任何一个 - 据我了解,在这种情况下,POST 是使用 AJAX 完成的,当 AJAX 调用完成时我需要重新启用。

我正在考虑显示一个覆盖/模式弹出窗口之类的东西,可能带有一个动画进度图像,该图像将在提交时显示。对于 UpdatePanel,在 AJAX 调用完成时隐藏。

有没有人有一个可以像上面那样轻松集成到 ASP.NET 页面中的示例?或者指出我需要挂钩哪些事件来显示/隐藏叠加层。

更新

@Aristos 的回答让我大部分时间都在那里。关键部分是处理 PageRequestManager.endRequest 以在 AJAX 调用完成时隐藏进度对话框。

在一种情况下我仍然遇到问题:如果提交按钮导致文件下载,我没有可以用来隐藏我的进度对话框的事件。 This question 有一个答案可以解决问题,我会试试看。

【问题讨论】:

    标签: jquery asp.net double-submit-prevention


    【解决方案1】:

    您根据标志放置允许/不允许提交表单,如:

    Page.Form.Attributes["onsubmit"] = "return fAllowToSubmit();";
    

    当您通过更新面板发送并等待返回时,您打开关闭提交的标志。

     <script type="text/javascript"> 
        var _fAllowToSubmit = true;
        // here you can throw and an alert() when _fAllowToSubmit==false
        function fAllowToSubmit() 
         {
            if(!_fAllowToSubmit)
              alert("Please wait for the page to be updated");
    
           return _fAllowToSubmit;
         }
    
        // to avoid calling it before the Sys loaded
        jQuery(document).ready(function() {
          var prm = Sys.WebForms.PageRequestManager.getInstance();    
           prm.add_initializeRequest(InitializeRequest);
           prm.add_endRequest(EndRequest);
        });
    
        function InitializeRequest(sender, args) {
           _fAllowToSubmit = false;
           // to make it even nicer you can place here a fade css class
           // it will auto-clear with the next update.
           jQuery("#YourWarpDiv").addClass("FadedDiv");
        }
    
        function EndRequest(sender, args) {
            _fAllowToSubmit = true;
        }
    </script>
    

    .FadedDiv
    {
        background-color: white;
        filter:alpha(opacity=50);
        opacity: 0.5;
        -moz-opacity:0.50;
    }
    

    当然,您还有“请稍候”消息,它可以通过更新面板自动打开。

    【讨论】:

    • Post/Redirect/Get 不适用于像 UpdatePanel 这样的 ajax 调用。
    • +1,这让我很顺利。查看问题的更新。
    • @Joe 我不确定您提到的这种情况是否适用于 updatePanel。此外,如果您在 UpdatePanel 触发后未返回有效的视图状态,则您的 UpdatePanel 存在问题。我也总是避免以这种方式发送文件,正确的方法是链接到发送文件的句柄。要完成解决方案,可以检查调用 InitializeRequest 的按钮 id,这很容易通过 UpdatePanel 的功能完成 -
    • 我得到了下载工作,即使是从更新面板,使用 cookie 来检测下载完成,如我链接的问题中所述。再次感谢您的帮助。
    猜你喜欢
    • 2011-02-07
    • 2011-05-14
    • 2011-05-31
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2012-03-09
    相关资源
    最近更新 更多