2015-07-21 33 views
1

我有一个类可以在多个地方重用。它有一个应用于它的默认验证器,它具有以下属性[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(); 
    } 
} 
+0

“比较的生日,以确保日期是<父母的生日” remided“不要成为一个威胁到中南部,而喝果汁您在胡德“:) –

回答

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