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

本文关键字:Webforms ASP | 更新日期: 2023-09-27 18:14:50

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

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

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

提前感谢。

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

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

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

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

我建议客户端onClick事件处理程序禁用按钮或使其不可见,最好是后者,并将按钮替换为标签,读"Processing…"或类似的东西

当使用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, Javascript可以被关闭,但这是不可能由那些不知道点击一次并等待响应的人完成的。:)

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

只需将扩展器附加到按钮上,并添加一个禁用操作。

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