我知道这是一个基本问题,但我很好奇不同的选择是什么,以及最佳做法是什么。
如果我有一个表格负责将预订保存到系统中,如果用户非常快速地按两次按钮,如何防止表单被发布两次?
我知道有几种方法可以实现这一目标,但我不确定哪种方法可以防止这种情况发生。部分是因为我是网络表单的新手,并且习惯于处理MVC。
提前致谢。
答案 0 :(得分: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;
}