首页 > 解决方案 > 如何让 ModelState 使用 TempData 机制?

问题描述

据我所知,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我不是 POST to 而是 POST 到类似的东西,然后如果模型中存在错误,/Update则执行重定向返回到,这将停止工作。/Index这是因为 ModelState 只持续当前的 HTTP 请求上下文,并且ValidationMessageFor依赖 ModelState 来获取它的错误消息。当您重定向回 时/Index,此状态将丢失。

这正是TempData设计的目的,因为它会保持其会话状态,直到它在以后的 HTTP 请求中被读取。但是,ModelState 似乎没有使用这样的机制。

有没有办法让 ModelState 使用某种机制,TempData这样如果我 POST 到不同的 URL 并重定向回无效的模型状态,我会正确地使用渲染到页面的错误消息ValidationMessageFor(更一般地说,我保留 ModelState从我重定向之前的表单提交)?

标签: c#asp.netasp.net-mvchttpsession

解决方案


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


推荐阅读