流畅的验证Vary对象验证器根据

时间:2015-07-21 03:52:28

标签: c# .net asp.net-mvc fluentvalidation

我有一个可以在多个地方重复使用的课程。它有一个应用它的默认验证器,它具有以下属性,[Validator(typeof(ChildValidator))]。

我希望覆盖已应用于Child类的验证器,具体取决于使用它的父类。下面是我的模型的简化版本。因此,我想在ChildValidator2中应用规则,而不是使用ChildValidator验证Child。可以这样做吗?

注意:以下代码将始终无法通过验证,因为它始终在ChildValidator中应用规则

型号:

    [Validator(typeof(ParentValidator))]
    public class Parent
    {
        public bool IgnoreChild { get; set; }
        public DateTime Birthdate { get; set; }

        public Child Children { get; set; }
    }

    [Validator(typeof(ChildValidator))]
    public class Child
    {
        public string ChildProperty{ get; set; }
        public DateTime Birthdate { get; set; }
    }

验证者:

public class ParentValidator : AbstractValidator<Parent>
{
    public ParentValidator()
    {
         RuleFor(model => model.Name).NotEmpty();

         When(x=>x.IgnoreChild, () =>
         {
             RuleForEach(model => model.Child).SetValidator(new ChildValidator2());
         });
    }
}

public class ChildValidator : AbstractValidator<Child>
{
    public ChildValidator()
    {
        RuleFor(model => model.ChildProperty).NotEmpty();
        //Compare birthday to make sure date is < Parents birthday
    }
}



public class ChildValidator2 : AbstractValidator<Child>
{
    public ChildValidator2()
    {
        RuleFor(model => model.ChildProperty).Empty();
    }
}

1 个答案:

答案 0 :(得分:0)

如果您调试FluentValidation源代码,您将看到AttributedValidatorFactory仅适用于控制器操作的参数(Parent),而不是它的子属性类(Child)。如果您未通过SetValidator()方法应用验证程序 - 则不会执行验证操作。因此,您的实验结果可能是由另一个原因引起的,而不是您的原因。

尝试为IgnoreChild标志的两个值明确指定验证器:

public class ParentValidator : AbstractValidator<Parent>
{
    public ParentValidator()
    {
         RuleFor(model => model.Name).NotEmpty();

         When(x=> x.IgnoreChild, () =>
         {
             RuleForEach(model => model.Child).SetValidator(new ChildValidator2());
         });
         When(x=> !x.IgnoreChild, () =>
         {
             RuleForEach(model => model.Child).SetValidator(new ChildValidator());
         });
    }
}
相关问题