如何防止MVC3上的多个post?

用户想要在他的博客中发帖,他填写该字段并单击submit

该网站运行缓慢,他再次点击,再次点击。

它终于被保存了,但现在他检查了他的post并看到了4个post。

我怎样才能防止这种情况发生? 如果用户点击提交一次我想对下次点击do nothingabort previous并开始新post,无论哪个更有意义或推荐。

在一个表格中

 @using (Ajax.BeginForm(...)) { } 

实现此目的的最简单方法是在单击后禁用提交按钮。

将以下javascript(jQuery)添加到您的视图中:

 $(function () { $('input[type="submit"]').click(function() { $(this).attr('disabled', 'disabled'); }); }); 

如果需要,请记住在ajax请求完成后启用按钮:

 $('input[type="submit"]').removeAttr('disabled'); 

更新:

最好在表单提交事件处理程序中禁用提交按钮,因为用户可以通过按Enter按钮提交表单:

 $(function () { $('form').submit(function() { $('input[type="submit"]', this).attr('disabled', 'disabled'); }); }); 

有很多解决方案。

一种是创建一个随机GUID ,将表单作为隐藏字段插入到数据库中。 在插入之前,它会检查GUID已存在。

或者,您可以使用诸如DateTime之类的不动产(作为隐藏字段发送到客户端)或“post标题”。

如果用户点击您创建真实post的post区域的操作链接,但将其“状态”设置为草稿? 在InsertOnSubmit()之后,post会立即重定向到您检索post并对其进行编辑的操作。 这种情况发生得太快,用户不会注意到。 因此,如果网站速度很慢并且他多次点击“提交”,您将不会生成仅保存到同一记录的新记录。 我在我工作的任务列表应用程序上使用该过程。 请参阅下面的代码。

更好的任务列表票务控制器

它可能不是最好的解决方案,但可以引导您找到适合您的更有创意的解决方案。

我的投票是针对ActionFilters。 这篇博客文章包含的代码可以放入您的项目并装饰您的操作。