javascript - 在 ASP.NET MVC 中防止表单双重发布的可能方法是什么?

标签 javascript html asp.net-mvc

在对我的 ASP.NET MVC 应用程序进行日志检查时,我发现一些用户成功地发布了相同的表单两次。我试图重现它,但我失败了。无论如何,我想阻止用户两次发布相同的数据。在 ASP.NET MVC 中是否有任何规范的解决方案,或者我必须开发自己的自定义解决方案?

在自定义解决方案的案例中,我可以想象客户端和服务器端的解决方案。在这两种情况下,你能给我推荐什么吗?

最佳答案

通常的做法是在点击提交按钮后立即禁用它。

像这样的 jQuery 应该可以工作:

<script type="text/javascript">
    $("#myform").submit(function()
        { $("#submit-button").attr("disabled", "disabled"); });
</script>

在仔细阅读您的问题并看到您使用 ASP.NET MVC 之后......

双发的原因可能是用户发完后刷新了页面。如果您只是从您的帖子操作中返回一个 View :

[AcceptVerbs (HttpVerbs.Pos)]
ActionResult ProcessUserPost ()
{
    /*...*/

    return View ();
}

然后浏览器将尝试通过执行相同的步骤重新创建页面,这意味着再次提交记住的表单。一些浏览器会显示一条警告消息 (FireFox),其他浏览器会安静地执行此操作(查看 Opera)。为了避免这种情况,您需要确保用户获得的页面是 GET 请求而非 POST 请求的结果。

基本上,您需要执行重定向而不是返回 View 。这将指示浏览器再次获取页面。

[AcceptVerbs (HttpVerbs.Pos)]
ActionResult ProcessUserPost ()
{
    /*...*/

    return RedirectToAction ("DisplayTheForm");
}

这种刷新页面的方式不会导致发送新的 POST 请求。

当然,这不会阻止您的用户点击后退按钮返回表单页面再次提交。但这种情况应该在您的业务逻辑中处理,无论您在做什么,检查同一用户是否重复提交了同一订单。

关于javascript - 在 ASP.NET MVC 中防止表单双重发布的可能方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1729726/

相关文章:

javascript - 浏览器兼容性问题列表?

javascript - 如何使用两个按钮在两个框之间移动文本?

c# - Asp.net MVC 如何用数字填充下拉列表

c# - 如何删除操作中的重复代码?

asp.net-mvc - 没有特定 Controller 的 ASP.NET MVC 3 路由

javascript - Array.prototype.map不能用于Promise吗?

javascript - 如何用jquery延迟函数的执行?

javascript - getitem 本地存储不工作

html - 响应式纯 CSS 菜单

javascript - HTML/CSS 动画 - JavaScript