在使用严格的 PRG 模式重定向 ModelState 失败后应该如何处理刷新?

How should a refresh be handled after a redirect on ModelState failure using the strict PRG pattern?

所以我一直使用松散的 PRG 模式,您 return 从 POST 操作中查看 ModelState 验证失败。然而,一直困扰着我的是,我不仅要在 GET 操作中构建模型,还要在 POST 操作失败时再次重建它。我使用了不同的方法来进行重建,使用 "view model builders" 或控制器中的私有函数为这两个操作构建视图模型,但这些仍然困扰着我。

阅读 Ben Foster (http://benfoster.io/blog/automatic-modelstate-validation-in-aspnet-mvc) 的这篇文章后,仅依靠 GET 操作来构建视图模型更有意义 - 将其保留在代码的一个区域 - 然后使用当您在失败 POST 上重定向回 GET 时,必要的操作过滤器会保存 ModelState 以供渲染。

所以我已经使用 Ben 在他的文章中提到的过滤器实现了这一点,如下所示。但是,我很好奇如果用户在 之后刷新 他们在 ModelState 失败时被重定向回 GET 会发生什么?我如何区分直接访问 GET 的人与 ModelState 失败的人?目前,如果用户在此时刷新,ModelState 将会消失。这是正确的操作,还是用户应该继续看到错误,直到他们 POST 具有有效数据?本质上,他们应该查看数据库中的数据,还是应该继续查看他们在 POSTing?

时所做的更改?
[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");
}

我在几个项目中使用相同的 [ImportModelStateFromTempData] 过滤器,效果很好。

在我看来,如果用户刷新,您不应该保留任何模型状态错误。用户正在请求该页面的全新视图,而永远无法获得干净的视图将令人沮丧。同样,在 POST 之后刷新不应该重新提交表单,在 GET 之后刷新也不应该保留 POST。