当验证失败时,ASP.NET MVC如何在表单中重新填充值?

ckv*_*ckv 4 asp.net asp.net-mvc web-applications asp.net-mvc-3

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

或者还有其他方法可以实现这一目标.

Luk*_*Led 9

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

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

ModelState.Values 保留所有的值和错误.

编辑

Ufuk的例子:

查看型号:

public class EmployeeVM
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

操作:

[HttpGet]
public ActionResult CreateEmployee()
{
    return View();
}

[HttpPost]
public ActionResult CreateEmployee(EmployeeVM model)
{
    model.FirstName = "AAAAAA";
    model.LastName = "BBBBBB";
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

视图:

@model MvcApplication1.Models.EmployeeVM

@using (Html.BeginForm("CreateEmployee", "Home")) {
    @Html.EditorFor(m => m)
    <input type="submit" value="Save"/>
}
Run Code Online (Sandbox Code Playgroud)

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

  • @PankajGarg - 这不是*必要*,这只是最佳实践.通常,您的视图与域模型具有不同的验证要求,如果是这种情况,则您无法直接传递域模型(否则您的验证将不正确).例如,当您有一个多步骤"向导"时,您只在任何给定步骤中填充模型的某些字段.另一个原因是安全性.虽然有一些方法可以防止不需要的绑定,但使用仅包含视图中所需数据的视图模型会很麻烦且更容易. (2认同)
  • @PankajGarg - 一般来说,View Models代表"最小访问"的概念,也就是说,您只传递视图所需的数据,而不是包含您不需要的东西的整个模型.如果您只进行简单的CRUD操作,其中所有内容都匹配,并且您在模型中没有敏感信息,那么请确保..继续,通过域模型.但是,大多数应用程序的要求更为复杂. (2认同)