在ajax场景中实现后重定向模式



考虑以下场景:我有一个可以打开对话框(jquery对话框)的页面。此对话框允许用户更新某些值,甚至插入新值。用户有时会多次单击"确认"按钮,该按钮会根据单击次数触发更新或插入。该方法是通过ajax调用(jquery-ajax)启动的,成功后会向用户显示一条漂亮的"完成了"消息。

在更新场景中,这很好,尽管我的服务器代码必须在数据库上调用update命令的次数与调用该方法的次数一样多。然而,在插入的情况下,我的数据被提交了几次,并且在数据库中插入了几行。这在其他方面造成了很多问题。

我读到了关于post-redirect-get模式的文章,这将是我问题的理想解决方案。但它只是说一个非ajax的帖子。当通过ajax调用完成对该方法的调用时,该怎么办?如何防止用户多次提交相同的东西?

我试图阻止对话框上的按钮,尽管它有效,但我认为这是一个糟糕的解决方案,因为按钮可能不会一直被阻止,特别是当用户的浏览器出现问题时。

除了在用户单击"保存"按钮后禁用该按钮(这是一个非常合理的解决方案)之外,另一个选项是在表单提交中使用一个唯一的验证令牌,每次用户单击"存储"时都会对其进行验证。

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

尽管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变量,否则您将无法再提交此表单,当然,除非您在其他地方更改该变量。

最新更新