1

考虑以下场景:我有一个可以打开对话框(jquery 对话框)的页面。此对话框允许用户更新一些值,甚至插入新值。用户有时会多次点击“确认”按钮,触发更新或插入的次数与点击次数一样多。该方法通过 ajax 调用 (jquery ajax) 触发,成功时会向用户显示一个不错的“完成”消息。

在更新场景中,这很好,即使我的服务器代码必须在数据库上调用更新命令的次数与调用该方法的次数一样多。但是在插入情况下,我的数据被提交了几次,并且在数据库中插入了几行。这会给其他领域带来很多问题。

我读到了 post-redirect-get 模式,这将是我问题的理想解决方案。但它只说一个非 ajax 帖子。如果通过 ajax 调用完成对方法的调用呢?如何防止用户多次提交同一件事?

我试图阻止对话框上的按钮,即使它有效,我认为这是不好的解决方案,因为按钮可能不会一直被阻止,特别是如果用户的浏览器有问题。

4

2 回答 2

1

除了在用户单击保存按钮后禁用它(这是一个完全合理的解决方案),另一种选择是在您的表单提交中使用唯一的验证令牌,每次用户单击保存时都会对其进行验证。

当请求表单视图时,生成一个唯一标识符(GUID 或类似的),将其存储在用户的会话中,并将其传递给视图。在视图中,包含唯一标识符作为随表单提交的隐藏字段之一。现在,当处理表单提交时,将请求中的值与会话中的值进行比较。如果请求值和会话值匹配,则将会话中的值替换为新的唯一标识符并执行数据库操作。如果请求值和会话值不匹配,您将知道用户重复提交。

于 2012-09-05T21:50:11.387 回答
0

尽管 Nathan Taylor 的解决方案是可能且正确的,但我更喜欢做一些更简单的事情。我创建了一个本地布尔值,它应该检查表单是否已提交。第一次提交表单时,此变量接收true并阻止进一步提交。检查下面的代码:

<script type="javascript">
var isSubmit = false;

$('#myForm').submit(function(){
  //Check if this is the first time the form is submitted
  if(isSubmit === true){
  return false;
}
isSubmit = true;
//Executes the form submission as it should be
});
</script>

请记住在对话框范围内创建此isSubmit变量,否则您将无法再提交此表单,当然,除非您在其他地方更改变量。

于 2012-09-14T17:22:29.153 回答