【问题标题】:How to prevent multiple posts on MVC3?如何防止 MVC3 上的多个帖子?
【发布时间】:2011-05-03 12:24:32
【问题描述】:

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

网站运行缓慢,他一次又一次地点击。

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

我怎样才能防止这种情况发生?如果用户点击提交一次我想do nothing 进行下一次点击或abort previous 并开始一个新帖子,以更有意义或推荐。

在一个表格中

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

【问题讨论】:

  • 什么都不做或放弃以前的并开始新的
  • @hunter 是的,我正在使用 jQuery。

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


【解决方案1】:

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

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

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

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

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

更新:

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

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

【讨论】:

  • 这将阻止帖子提交即使点击确实没有成功。我更喜欢server-side检查。
  • @Aliostad:也是一个好点。我的回答只影响用户界面,不保护多个请求。
  • 有一个类似的问题和答案,它也使用 JQuery,但考虑到表单是否有效...stackoverflow.com/questions/6080360/…
  • 设置disabled 似乎没有调用我的btnSubmit_Click() 处理程序,所以我改用.hide()。通过使用hide() 而不是disabled,你们能想到什么缺点吗?我仍在使用 Session 进行一些服务器端检查,但总是希望在不需要时不访问服务器。
【解决方案2】:

有很多解决方案。

一个是创建一个随机的GUID 作为隐藏字段的表单是 随帖子插入数据库。 在插入之前,它会检查GUID 已经存在了。

或者,您可以使用真实属性,例如 DateTime(作为隐藏字段发送到客户端)或“帖子标题”。

【讨论】:

    【解决方案3】:

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

    Better Task List Ticket Controller

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

    【讨论】:

    • 您提供的链接已失效
    • 感谢约翰的提醒,我修复了网址。
    【解决方案4】:

    我投票支持 ActionFilters。 This blog post 的代码可以直接放入您的项目并装饰您的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多