因此,我总是使用松散的PRG模式,从POST操作返回ModelState验证失败的视图。然而,我总是困扰我,我不仅要在GET操作中构建模型,还要在失败的POST操作中再次重建它。我使用"查看模型构建器"来使用不同的方法进行重建。或者只是控制器中的一个私有函数,它为两个动作构建视图模型,但这些仍然困扰着我。
在阅读Ben Foster(http://benfoster.io/blog/automatic-modelstate-validation-in-aspnet-mvc)的这篇文章之后,仅仅依靠GET操作来构建视图模型 - 将其保留在代码的一个区域 - 然后使用必要的内容会更有意义当您在失败的POST上重定向回GET时,动作过滤器保存ModelState以进行渲染。
所以我已经实现了使用过滤器Ben在他的文章中提到如下。但是,我很好奇如果用户在之后刷新,他们在ModelState失败时被重定向回GET会发生什么?我如何区分直接访问GET的人与ModelState失败?目前,如果用户在该点刷新,ModelState将消失。这是正确的操作,还是用户应该继续查看错误,直到他们使用有效数据进行POST?基本上,他们应该看到数据库中的数据,还是应该继续看到他们在POST时所做的更改?
[ImportModelStateFromTempData]
public ActionResult Edit(int id)
{
// in a real application this would be retrieved from the db
var editView = new EditView()
{
UserId = id,
Name = "John Doe",
Age = 20,
Message = "Hello world"
};
return View(editView);
}
[HttpPost]
[ValidateModelState]
public ActionResult Edit(EditCommand editCommand)
{
// save to db here in real application
return RedirectToAction("Success");
}
答案 0 :(得分:1)
我在几个项目中使用相同的[ImportModelStateFromTempData]
过滤器,效果很好。
在我看来,如果用户刷新,您不应该保留任何模型状态错误。用户要求获得该页面的全新视图,并且永远无法获得干净的视图令人沮丧。同样徒劳的是,POST后刷新不应该重新提交表单,在GET之后刷新不应该保留POST。