如何防止MVC3上的多个帖子?

时间:2011-05-03 12:24:32

标签: c# asp.net-mvc asp.net-mvc-3

  

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

     

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

     

终于保存了,但现在他检查了他的帖子并看到了4个帖子。

如何防止这种情况发生?如果用户点击提交一次,我希望do nothing进行下一次点击或abort previous并开始新帖子,以较晚者为准更有意义或推荐。

带有

的表单
@using (Ajax.BeginForm(...))
{
}

4 个答案:

答案 0 :(得分:17)

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

将以下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');
    });
});

答案 1 :(得分:3)

有很多解决方案。

  

一个是创建一个随机GUID   作为隐藏领域的形式   用帖子插入数据库。   在插入之前,它会检查GUID   已经存在。

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

答案 2 :(得分:0)

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

Better Task List Ticket Controller

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

答案 3 :(得分:0)

我的投票是针对ActionFilters。 This blog post有代码可以放入您的项目并装饰您的行为。