代码之家  ›  专栏  ›  技术社区  ›  Jakub Å turc

在ASP.NET中防止表单重复发布的可能方法是什么。网络MVC?

  •  3
  • Jakub Å turc  · 技术社区  · 16 年前

    我可以想象客户端和服务器端的定制解决方案。无论哪种情况,你能给我推荐什么吗?

    4 回复  |  直到 16 年前
        1
  •  8
  •   user151323 user151323    16 年前

    这样的jQuery应该可以工作:

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

    双重发布可能是因为用户在发布后刷新了页面。如果你只是从发布操作中返回一个视图:

    [AcceptVerbs (HttpVerbs.Pos)]
    ActionResult ProcessUserPost ()
    {
        /*...*/
    
        return View ();
    }
    

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

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

    [AcceptVerbs (HttpVerbs.Pos)]
    ActionResult ProcessUserPost ()
    {
        /*...*/
    
        return RedirectToAction ("DisplayTheForm");
    }
    

        2
  •  5
  •   tvanfosson    16 年前

    1. 使用仅适用于一个操作的一次性随机数来防止双重发布。在页面上包含一个隐藏的随机数,您可以在看到第一篇帖子后跟踪并标记为已使用。当你得到这个随机数时,请检查它,以确保它以前没有被使用过,如果有,请显示错误消息,而不是采取行动。
    2. 通过检查发布数据的唯一性约束来防止破坏性行为。这实际上是(2)的一个变体,因为你的随机数基本上是实际数据中的某个唯一值。这适用于某些创建场景,即,您不能创建具有相同电子邮件地址的重复用户,但当他们的电子邮件地址在数据中没有唯一字段时会失败。后者的一个例子可能是购买交易,用户可能会多次购买同一物品。
        3
  •  3
  •   Nathan Taylor    16 年前

    1. 服务器并将其放置在 会话和隐藏字段。

    2. 当用户发布回第一个 时间比较隐藏的密钥 然后更改或删除密钥 从会话中获取并更新 隐藏的领域也是如此。

    3. 如果用户 第二篇文章将失败,因为 HTML中的隐藏字段将不会 直到页面刷新。

        4
  •  2
  •   Robert Koritnik    16 年前

    两步流程


    这将防止用户在浏览器等待服务器响应时提交两次表单。但你应该小心这个。当用户点击提交时,您必须首先验证您的表单(如果您使用客户端验证),当它有效时,立即使用此代码禁用按钮。

    $(":submit, :button").attr("disabled", true);
    


    图案。

    RedirectToAction();
    RedirectToRoute();
    Redirect(); // redirects to URL
    

    编辑
    正如您在评论中所说,您的页面已经使用了P-R-G模式。在这种情况下,我会确保实施第一步。