通过 post 提交表单然后重定向到相同或不同 URL 的 ASP.NET MVC 模式非常容易编写代码。
想象一下这个场景:
我担心即使我为 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/