验证模型或视图模型?

时间:2013-11-02 18:13:31

标签: c# asp.net-mvc

我正在阅读教程并尝试习惯使用ViewModels和Validation。我不确定验证是在主模型还是视图模型上进行,我认为它是在ViewModel上。但是,如果我试图继承一个类属性,那么在ViewModel上添加验证似乎没有意义,所以我把它留在了模型本身,但错误没有显示出来。也许模型效率低下,需要重新安排一下?

NameModel

 public class name {
      [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
      public string first { get; set; }
      public string middle  { get; set; }
      [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
      public string last  { get; set; }
      public string otherstuffnotneededontheview { get; set; }
 }

RegisterViewModel

 public class RegisterViewModel {
     public name fname { get; set; }
     public name lname { get; set; }
 }

查看

 @model Project.ViewModels.RegisterViewModel

 @using (Html.BeginForm())
 {
     <label>
     @Html.TextBoxFor(model => model.fname.first)
     @Html.ValidationMessageFor(model => model.fname.first)
     </label>

     <label>
     @Html.TextBoxFor(model => model.lname.last)
     @Html.ValidationMessageFor(model => model.lname.last)
     </label>
     <input type="submit" />
 }

控制器

 public ActionResult Register()
 {
      RegisterViewModel model = new RegisterViewModel();
      return View(model);
 }

 [HttpPost]
 public ActionResult Register(RegisterViewModel model)
 {
       return View(model);
 }

1 个答案:

答案 0 :(得分:6)

所有验证都需要在ViewModel上完成。

在您的情况下,RegisterViewModel是视图关联public ActionResult Register()的数据表示,这意味着视图返回RegisterViewModel对象而不是name对象。

ModelState.IsValid检查验证视图的输入[Register.cshtml]与[RegisterViewModel而不是name]

绑定的类型有关

因此,只有应用于RegisterViewModel的属性才会被验证。

因此您需要在ViewModel中执行验证。

这反过来为您提供了额外的灵活性,可以为不同的ViewModel使用不同的验证规则(尽管ViewModel绑定到相同的底层模型)

编辑:(有代码建议)

没有验证规则应用于模型属性

public class name {
      public string first { get; set; }
      public string middle  { get; set; }
      public string last  { get; set; }
      public string otherstuffnotneededontheview { get; set; }
 }

它们在ViewModel中应用

public class RegisterViewModel {
     [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
     public string fname { get; set; }
      [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
     public string lname { get; set; }
 }

此更改应该足够了(猜测您正确绑定RegisterViewModelname