Asp.net mvc 在ASP.NET MVC中有什么替代方法可以进行POST重定向获取?
通过post提交表单,然后重定向到相同或不同URL的ASP.NETMVC模式非常容易编码 想象一下这个场景:Asp.net mvc 在ASP.NET MVC中有什么替代方法可以进行POST重定向获取?,asp.net-mvc,usability,Asp.net Mvc,Usability,通过post提交表单,然后重定向到相同或不同URL的ASP.NETMVC模式非常容易编码 想象一下这个场景: 用户进入/products/42/edit查看和编辑产品42 他们在那个页面上看到一些疯狂的东西,编辑它,然后点击save。这会导致一篇文章被编辑到/products/42/edit 该操作更新数据并重定向到或返回/products/42/edit 用户看到更新后的数据并感到高兴 一小时后,他们点击“刷新”按钮,查看是否有人对产品42进行了修改 因为上次对/products/42/edi
请参见和,您的意思是,当用户点击“刷新”时,您会看到一个过时的视图。由此,我假设您的GET操作使用了POST操作中存储在TempData中的某个对象。在这种情况下,一种可能的解决方法是使用Session而不是TempData来存储POST操作的结果。为了让您的过账表单按照您描述的方式工作,它需要从数据库读取数据并预填充表单上的字段。它需要在您第一次输入有问题的URL时就这样做 然后,在发布时,需要在验证值后将其保存到数据库中。这将完成您的往返循环 如果页面是空白的“新记录”页面,那么您是对的,它只会在验证失败时往返一次。在F5上,它只会根据设计为您提供一个新的空白表单。您的更新:是 使用/product/{id}/进行查看,使用/product/{id}/edit进行编辑,编辑后将它们重定向到/product/{id}/
问题解决了。我想知道为什么您正在/正在使用/product/{id}/edit进行查看和编辑。如果您确实想查看和编辑同一个页面,并且需要处理并发性,则可以包含保持上次更新日期的隐藏字段。因此,流程将是:
这只是另一种选择。尽管我同意前面的答案中所说的,即在文章完成后不再将用户返回编辑视图;它没有回答为什么推动刷新会重新发布表单的问题 以下是“刷新浏览器导致另一篇文章”问题的解决方案 目前,您正在这样做:
[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)]//当用户点击F5时,对表单进行轴化将没有任何帮助。这取决于表单是否足够聪明,能够识别当前状态,不是吗?但是如果表单足够聪明,能够识别当前状态,那么在没有AJAX的情况下也可以工作。我想Frank Krueger的一些示例代码会让事情变得更清楚。我不理解这个问题。用户提交他们的编辑,这些编辑被写入数据库,然后用户被定向到产品的当前视图。他们点击F5和产品更新的当前视图。问题在哪里?考虑在你的控制器方法和你的视图中张贴一些代码,这样我们就可以看到发生了什么。我已经澄清了这个问题(我希望)。我发现在POST和GET之间共享URL对我来说是个坏主意。那么,如果这两个是不同的,那么我就不会有“刷新原因重新发布”的问题吗?附录:如果你真的想在同一个页面中查看和编辑,那么你应该考虑Ajax化你的表单。在一个成功的帖子之后重定向到一个GET始终是个好主意。但是,如果ModelState无效,可以简单地调用GET EditProduct方法。调用EditProduct方法将重建视图,MVC框架将使用ModelState中的发布值覆盖任何模型数据。。。祝贺你!:)版本号会比日期更好
[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