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

时间:2011-11-14 19:50:05

标签: c# asp.net webforms

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

如果我有一个表格负责将预订保存到系统中,如果用户非常快速地按两次按钮,如何防止表单被发布两次?

我知道有几种方法可以实现这一目标,但我不确定哪种方法可以防止这种情况发生。部分是因为我是网络表单的新手,并且习惯于处理MVC。

提前致谢。

5 个答案:

答案 0 :(得分:2)

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

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

  2. 使用javascript停用提交按钮。如果采用这种方法,并且需要触发按钮事件处理程序,则需要在提交之前使用按钮的name属性创建隐藏输入。隐藏的输入是必需的,因为禁用的输入不会在后期数据中结束。

答案 1 :(得分:1)

我建议使用一个客户端onClick事件处理程序来禁用该按钮或使其不可见,最好是后者,并将该按钮替换为标记为“Processing ...”或类似的东西

答案 2 :(得分:1)

使用asp:Button提交时,我一直在使用这样的东西:

1)设置提交按钮UseSubmitBehavior="false"

2)设置提交按钮OnClientClick="pleaseWait(this, 'Please Wait...');"

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,但是那些没有理由点击一次并等待响应的人不太可能做到这一点。 。 :)

答案 3 :(得分:0)

简单方法 - 使用ajax AnimationExtender控件。http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/Animation/Animation.aspx

只需将扩展程序附加到按钮并添加禁用操作。

答案 4 :(得分:0)

 <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;
}