6

我试图验证含有使用System.ComponentModel.DataAnnotations属性验证规则其他对象的模型,希望在默认MVC实现就足够了:支持嵌套模式和验证类与ASP.NET MVC 2.0

var obj = js.Deserialize(json, objectInfo.ObjectType); 
if(!TryValidateModel(obj)) 
{ 
    // Handle failed model validation. 
} 

该对象由原始类型组成,但也包含也使用DataAnnotications的其他类。像这样:

public class Entry 
{ 
    [Required] 
    public Person Subscriber { get; set; } 

    [Required] 
    public String Company { get; set; } 
} 

public class Person 
{ 
    public String FirstName { get; set;} 

    [Required] 
    public String Surname { get; set; } 
} 

的问题是,ASP.NET MVC验证仅下降1级,只有评估顶层类的属性,可以在digitallycreated.net/Blog/54/deep阅读 - 内部-asp.net-MVC -2-模型元数据和验证。

有没有人知道这个优雅的解决方案?我试过xVal,但它们似乎使用非递归模式(http://blog.stevensanderson.com/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/)。

有人必须遇到这个问题才对吗?如果您正在设计Web服务,将对象嵌套到模型中似乎并不奇怪。

+1

ModelState.IsValid由于某种原因验证还嵌套的对象,不像TryValidateModel。混乱。 – JustAMartin 2012-10-16 11:35:57

回答

1

我建议寻找codeplex的Fluent验证。验证规则包含在一个单独的类中(类似于NHibernate和Fluent NHibernate的工作方式)。一个使用lambda来指定要验证的属性,支持子属性。

`

public class MaintainCompanyViewModelValidator : AbstractValidator<MaintainCompanyViewModel> 
    { 
     public MaintainCompanyViewModelValidator() 
     { 
      RuleFor(model => model.Company.ShortName) 
       .NotEmpty(); 
     } 

`