2013-11-02 110 views
0

我正在阅读教程并试图习惯使用ViewModels和验证。我不确定验证是在主模型还是视图模型上进行,我假设它将在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); 
} 

回答

6

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

在你的情况的RegisterViewModel是相关联public ActionResult Register()视图,这意味着,该视图返回一个RegisterViewModel对象不是name对象的数据表示。

ModelState.IsValid检查验证视图的输入[Register.cshtml]针对它被绑定到[RegisterViewModelname]

因此,只有施加到RegisterViewModel的属性将被验证的类型。

所以你需要在ViewModel中执行验证。

这匝提供你的能够使用不同验证规则不同的ViewModels(尽管的ViewModels被绑定到相同的基础模型)额外的灵活性

编辑:(带有码建议)

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

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

它们在视图模型应用,而不是

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