【问题标题】:How does ASP.NET MVC repopulate values in form when validation fails?验证失败时,ASP.NET MVC 如何在表单中重新填充值?
【发布时间】:2013-06-11 23:09:32
【问题描述】:

在 Web 表单中使用视图状态。但是在 ASP.NET MVC 中,由于模型绑定可用,因此可以在控制器中轻松访问属性。但是,当模型验证失败时,ASP.NET MVC 是否会自动填充表单控件以实现验证失败?

或者有没有其他方法可以做到这一点。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 web-applications


    【解决方案1】:

    有一个名为ModelState 的属性(在Controller 类中),它包含所有值。它用于模型绑定。当验证失败时,ModelState 保存所有验证错误的值。

    ModelState.IsValid 告诉你,验证没有抛出任何错误。

    ModelState.Values 保存所有值和错误。

    编辑

    Ufuk 示例:

    查看模型:

    public class EmployeeVM
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    动作:

    [HttpGet]
    public ActionResult CreateEmployee()
    {
        return View();
    }
    
    [HttpPost]
    public ActionResult CreateEmployee(EmployeeVM model)
    {
        model.FirstName = "AAAAAA";
        model.LastName = "BBBBBB";
        return View(model);
    }
    

    查看:

    @model MvcApplication1.Models.EmployeeVM
    
    @using (Html.BeginForm("CreateEmployee", "Home")) {
        @Html.EditorFor(m => m)
        <input type="submit" value="Save"/>
    }
    

    如您所见,在 POST 方法中,值被 AAAAA 和 BBBBB 覆盖,但在 POST 之后,表单仍然显示发布的值。它们取自ModelState

    【讨论】:

    • 这是否意味着当验证自动失败时,modelstate.values 中的值会填充到表单中?
    • @LukLed : 你在视图模型中缺少Required Fields 吗?
    • @PankajGarg:这个例子是关于ModelState,不是必填字段。
    • @PankajGarg - 这不是必要的,它只是最佳实践。通常您的视图与您的域模型有不同的验证要求,如果是这种情况,那么您不能直接传递您的域模型(否则您的验证将不正确)。例如,当您有一个多步骤“向导”时,您只需在任何给定步骤上填写模型的某些字段。另一个原因是为了安全。尽管有一些方法可以防止不必要的绑定,但使用仅包含视图中所需数据的视图模型既麻烦又容易。
    • @PankajGarg - 通常,视图模型代表“最少访问”的概念,也就是说,您只将所需的数据传递给视图,而不是包含您不需要的东西的整个模型需要。如果您只进行简单的 CRUD 操作,所有内容都匹配,并且模型中没有敏感信息,那么可以确定.. 继续,传递域模型。但是,大多数应用都有更复杂的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多