ASP.NET MVC 2.0支持嵌套模型和类验证

6

我正在尝试使用System.ComponentModel.DataAnnotations属性验证包含其他对象的模型,希望默认的MVC实现足够:

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

该对象由基本类型组成,但也包含其他使用DataAnnotations的类。例如:
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的验证只会向下检查一层,并且只会评估顶级类的属性,可以在digitallycreated.net/Blog/54/deep-inside-asp.net-mvc-2-model-metadata-and-validation上阅读到相关内容。
有谁知道一个优雅的解决方案吗?我已经尝试了xVal,但它们似乎使用了非递归模式(http://blog.stevensanderson.com/2009/01/10/xval-a-validation-framework-for-aspnet-mvc/)。
肯定有人遇到过这个问题,对于设计Web服务的人来说,在模型中嵌套对象并不奇怪。

2
ModelState.IsValid 由于某种原因,会验证嵌套对象,而 TryValidateModel 则不会。令人困惑。 - JustAMartin
1个回答

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

`

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

`


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接