如何让ModelState使用TempData机制?

时间:2018-07-10 11:02:17

标签: c# asp.net asp.net-mvc http session

据我所知,ASP.NET的ModelState机制存在一些问题。它仅在当前HTTP请求的上下文中保留。假设我只想使用服务器端验证。我可以在.cshtml视图中写这个:

@using (Html.BeginForm("Index", "MyController", routeValues: new { Area = "MyArea" }, method: FormMethod.Post, htmlAttributes: new { @autocomplete = "off" }))
{
    @Html.TextBoxFor(m => m.SomeTextbox, new { @class = "form-control" })
    @Html.ValidationMessageFor(m => m.SomeTextbox)
    ...

...我的模型在哪里

public class SomeModel
{
    [Display(Name = "Some Textbox")]
    [Required]
    public string SomeTextbox { get; set; }

如果我现在在我的操作方法中检查模型状态的有效性,当我提交不包含任何内容的表单时,ValidationMessageFor帮助者会正确显示验证消息(“基本文本框为必填字段”。)文本框:

public class MyController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View(new SomeModel());
    }

    [HttpPost]
    public ActionResult Index(SomeModel model)
    {
        if (!ModelState.IsValid)
        {
            // Server-side model validation failed; abort!
            return View(model);
        }
        ...

但是,如果模型中存在错误,而不是发布到/Index之类的东西,而不是发布到/Update之类的东西,然后重定向回/Index,这将停止工作。这是因为ModelState仅在当前HTTP请求上下文中有效,并且ValidationMessageFor依赖ModelState来获取其错误消息。当您重定向回到/Index时,此状态会丢失。

这正是TempData旨在解决的问题,因为它保持会话状态,直到在以后的HTTP请求中读取它为止。但是,ModelState似乎没有使用这种机制。

是否可以让ModelState使用TempData之类的机制,以便如果我发布到其他URL并重定向回无效的模型状态,则可以正确地使用{{ 1}}(通常,在重定向之前,我保留了表单提交中的ModelState)?

1 个答案:

答案 0 :(得分:0)

好的,所以基本上我发现我所描述的是PRG模型,它在ASP.NET中通常不使用。通常,您将POST返回到相同的URL,因此具有在其中进行POST的HTTP上下文,并且仅在成功的情况下重定向,在这种情况下,您不再需要ModelState。人们已经提出了解决方法,以在ASP.NET中实现PRG,例如:
https://andrewlock.net/post-redirect-get-using-tempdata-in-asp-net-core/