因此,我一直使用宽松的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为止?从本质上讲,他们应该看到数据库中的数据,还是应该继续查看发布时所做的更改?

[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。

关于c# - 使用严格的PRG模式对ModelState进行重定向后,应如何处理刷新?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29332926/

10-16 18:36