C# Fluent validation根据类it';用于

C# Fluent validation根据类it';用于,c#,.net,asp.net-mvc,fluentvalidation,C#,.net,Asp.net Mvc,Fluentvalidation,我有一个可以在多个地方重用的类。它应用了一个默认的验证器,该验证器具有以下属性,[validator(typeof(ChildValidator))] 我希望根据使用它的父类重写应用于子类的验证器。下面是我的模型的简化版本。因此,我希望在ChildValidator 2中应用规则,而不是使用ChildValidator验证子对象。这能做到吗 注意:以下代码将始终无法通过验证,因为它将始终在ChildValidator中应用规则 型号: [Validator(typeof(ParentVa

我有一个可以在多个地方重用的类。它应用了一个默认的验证器,该验证器具有以下属性,[validator(typeof(ChildValidator))]

我希望根据使用它的父类重写应用于子类的验证器。下面是我的模型的简化版本。因此,我希望在ChildValidator 2中应用规则,而不是使用ChildValidator验证子对象。这能做到吗

注意:以下代码将始终无法通过验证,因为它将始终在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();
    }
}
公共类ParentValidator:AbstractValidator { 公共ParentValidator() { RuleFor(model=>model.Name).NotEmpty(); 当(x=>x.IgnoreChild,()=> { RuleForEach(model=>model.Child).SetValidator(新的ChildValidator2()); }); } } 公共类ChildValidator:AbstractValidator { 公共儿童验证器() { RuleFor(model=>model.ChildProperty).NotEmpty();
//比较生日,确保日期<父母生日 } } 公共类ChildValidator 2:抽象验证器 { 公共儿童基金会2() { RuleFor(model=>model.ChildProperty).Empty(); } }
如果调试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());
         });
    }
}
公共类ParentValidator:AbstractValidator { 公共ParentValidator() { RuleFor(model=>model.Name).NotEmpty(); 当(x=>x.IgnoreChild,()=> { RuleForEach(model=>model.Child).SetValidator(新的ChildValidator2()); }); 当(x=>!x.IgnoreChild,()=> { RuleForEach(model=>model.Child).SetValidator(新的ChildValidator()); }); } }
“比较生日,确保日期是<父母的生日”删除“在兜帽里喝果汁时不要对中南部造成威胁”: