0

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

名称型号

 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; }
 }

注册视图模型

 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);
 }
4

1 回答 1

6

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

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

ModelState.IsValid检查根据它绑定到的类型验证视图的输入 [Register.cshtml] [ RegisterViewModelnot 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

于 2013-11-02T18:31:26.130 回答