asp.net-mvc - ASP.NET MVC 中的 POST-redirect-GET 有什么

通过 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/

相关文章:

sql-server - 如何计算 SQL 中 float 的模数?

functional-programming - 与实数的模式匹配(标准 ML)

sql - 从 SQL 中的逗号分隔值获取第一个或第二个值

perl - 在 Perl OOP 中继承抽象方法时找不到方法错误

excel-2007 - 使用数据透视表时如何显示 Excel 2007 生成的 MDX?

vbscript - MSXML2.ServerXMLHTTP 访问被拒绝错误

iphone - 检查输入的文字是否只使用英文字母

.net - Winform 样式问题 : Windows classics style?

vb.net - 加入整数数组

php - 仅将唯一值插入数组