gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 中的 POST-redirect-GET 有什么替代方案?

转载 作者:行者123 更新时间:2023-12-05 08:21:31 24 4
gpt4 key购买 nike

通过 post 提交表单然后重定向到相同或不同 URL 的 ASP.NET MVC 模式非常容易编写代码。

想象一下这个场景:

  1. 用户转到 /products/42/edit 查看和编辑产品 42。
  2. 他们在那个页面上看到一些疯狂的东西,编辑它,然后点击保存。这会导致 POST 到 /products/42/edit
  3. 操作更新数据并重定向到返回/products/42/edit的 View
  4. 用户看到更新后的数据很高兴。
  5. 一小时后,他们单击刷新以查看是否有其他人弄乱了产品 #42。
  6. 因为 /products/42/edit 的最后一次检索是 POST,他们的浏览器要求重新提交表单数据。这很烦人而且很危险,因为它会覆盖其他人的数据。

我担心即使我为 POST 和 GET 使用两个不同的 URL(比如 /products/42/edit/products/42),浏览器仍然会要求重新发布并且可以破坏数据。我错了吗?

可以使用哪些替代方法,以便在提交产品更改后,用户可以安全地点击刷新以获取更新的 View ?

更新 我现在发现我的问题和我的设计是困惑的,对此我深表歉意。我发现在 POST 和 GET 之间共享 URL(操作)对我来说是个坏主意。那么,如果这两者不同,那么我就不会遇到“刷新导致重新发布”问题,我的假设是否正确?

最佳答案

虽然我同意主要回答中关于在帖子完成后不再将用户返回到“编辑” View 的说法;它没有回答为什么推送刷新重新发布表单的问题。

这里是'浏览器刷新导致另一个帖子'问题的解决方案。

此刻你正在这样做:

[AcceptVerbs(HttpVerbs.Post)]    // <--  this action will be used for POSTs
EditProduct(string data1, string data2)
{
// Handle Data, save to DB
// Do some work
return View("EditProduct"); // <-- You are rendering the view from
} // A post action - this is bad!

当你实际上应该这样做时:


[AcceptVerbs(HttpVerbs.Post)]    //  <-- This action will be used for POSTs
EditProduct(string data1, string data2)
{
// Handle Data, save to DB
// Do some work
return RedirectToAction("EditProduct"); // <-- Redirect to a GET Action
}

[AcceptVerbs(HttpVerbs.Get)] // <-- This action will be used for GETs
EditProduct()
{

return View("EditProduct"); // <-- Render the view from the GET action
} // So when you refresh it will refresh the GET

关键是,不要在响应POST时返回View,否则浏览器中的最后一个Request是POST请求,在浏览器中推送刷新将重新发布。相反,当您完成发布操作后,使用 RedirectToAction() 重定向到“GET”操作。 GET 操作依次返回 View 。这意味着浏览器中的先前请求是 GET 请求,如果您推送刷新,它将再次获取它,而不是重新发布它。我在开始使用 MVC 时犯了同样的错误。

关于asp.net-mvc - ASP.NET MVC 中的 POST-redirect-GET 有什么替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1284703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com