C# 防止在ASP.NET Webforms中过度发布

C# 防止在ASP.NET Webforms中过度发布,c#,asp.net,webforms,C#,Asp.net,Webforms,我知道这是一个基本问题,但我很好奇不同的选择是什么,最佳做法是什么 如果我有一个负责将预订保存到系统中的表单,如果用户很快点击两次按钮,我如何防止表单被发布两次 我知道有几种方法可以做到这一点,但我不太确定哪种方法是防止这种情况发生的标准方法。部分原因是我不熟悉web表单,并且习惯于处理MVC 提前感谢。简单方法-使用ajax AnimationXtender控件 只需将扩展器连接到按钮并添加一个禁用操作。我建议使用一个客户端onClick事件处理程序来禁用按钮或使其不可见,最好是后者,并将按钮

我知道这是一个基本问题,但我很好奇不同的选择是什么,最佳做法是什么

如果我有一个负责将预订保存到系统中的表单,如果用户很快点击两次按钮,我如何防止表单被发布两次

我知道有几种方法可以做到这一点,但我不太确定哪种方法是防止这种情况发生的标准方法。部分原因是我不熟悉web表单,并且习惯于处理MVC


提前感谢。

简单方法-使用ajax AnimationXtender控件


只需将扩展器连接到按钮并添加一个禁用操作。

我建议使用一个客户端onClick事件处理程序来禁用按钮或使其不可见,最好是后者,并将按钮替换为一个标签,上面写着“Processing…”或类似的内容。

我使用了两种方法来解决此问题:

  • 使用基于令牌的方法。每个页面都有一个带有当前随机标记的隐藏输入。此令牌也存储在用户的会话中。一旦回发发生,我将比较令牌,如果它们有效,则生成一个新的会话令牌并继续处理。当发生第二次回发时,令牌不再匹配并阻止处理

  • 使用javascript禁用submit按钮。如果采用这种方法,并且需要启动按钮事件处理程序,则需要在提交之前使用按钮的name属性创建一个隐藏输入。需要隐藏输入,因为禁用的输入不会在post数据中结束


  • 在使用
    asp:Button
    提交时,我一直在使用类似的方法:

    1) 设置提交按钮的
    使用submitbehavior=“false”

    2) 设置提交按钮的
    OnClientClick=“plesewait(这是“请等待…”);”

    3) 在页面中包含javascript代码:

    function pleaseWait(obj, message) {
        if (typeof(Page_ClientValidate) == 'function') {
            if (Page_ClientValidate()) {
                obj.disabled = true;
                obj.value = message;
                return true;
            }
        }
        return false;
    } 
    
    这个解决方案很好,因为它很简单,但仍然考虑客户端javascript验证。它并不完美,因为它仍然依赖于Javascript,Javascript可以关闭,但这不太可能由没有意识单击一次并等待响应的人来完成。:)

     <asp:Button ID="CopyScenarioButton" ClientIDMode="Static" OnClick="CopyScenarioButton_Click"
                                OnClientClick="setTimeout( function() {$('#CopyScenarioButton').attr('disabled', 'disabled');},0)"
                                EnableViewState="false" Text="Save New Scenario" ToolTip="Save New Scenario"
                                CssClass="btnNormal" runat="server" />
    
        function PreSaveHybrid() {
           var doSave = PreSave();
           if (doSave !== false) //returns nothing if it's not a cancel
           setTimeout(function () { $('#btnSave').attr('disabled', 'disabled'); }, 0);
        return doSave;
    }