如果验证失败,用户值如何在'strict-PRG'方案中保留?

时间:2014-06-30 14:41:19

标签: asp.net-mvc post-redirect-get

在传统的ASP MVC POST操作中,用户修改的模型将直接返回到视图,如Darin's answer中所述:

    if (!ModelState.IsValid)
    {
        return View(model);
    }

但是,使用严格的Post-Redirect-Get模式described on SO hereand by Kazi Manzur Rashid here(#13),将保留ModelState,但会在原始GET操作上重新创建模型。那么用户如何获得她输入的值?

    if (!ModelState.IsValid)
    {
        return RedirectToAction("index");
    }

我看到我使用的浏览器会恢复值,但这依赖于浏览器。这是我可以依赖的标准浏览器行为吗?我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:0)

我认为你不了解Post-Redirect-Get。您回发到首先渲染表单的同一视图。如果出现错误,您只需返回视图即可。只有在提交有效且成功的情况下才会重定向到新视图。

为了说明,所有Post-Redirect-Get样式工作流程都将包含以下形式的操作:

// Original GET that returns form to user
public ActionResult SomeForm()
{
    return View();
}

// Receives posted data and returns same view, based on having the
// same action name
[HttpPost]
public ActionResult SomeForm(PostDataModel model)
{
    if (ModelState.IsValid)
    {
        // save to database or whatever
        // Success, so you redirect
        return RedirectToAction("SomeFormSuccess");
    }

    // Errors, so you return view
    return View(model);
}

// Totally separate action that serves as place to drop the user so
// refreshing the page does not resubmit the form. If you want to
// redisplay the data the user posted, you query it back from the
// database or wherever else it was stored.
public ActionResult SomeFormSuccess()
{
    return View();
}

答案 1 :(得分:-1)

这听起来很适合MVC的TempData属性包,它允许您将数据存储在一个请求中,并在下一个请求中访问它。