C# Fluent validation根据类it';用于
我有一个可以在多个地方重用的类。它应用了一个默认的验证器,该验证器具有以下属性,[validator(typeof(ChildValidator))] 我希望根据使用它的父类重写应用于子类的验证器。下面是我的模型的简化版本。因此,我希望在ChildValidator 2中应用规则,而不是使用ChildValidator验证子对象。这能做到吗 注意:以下代码将始终无法通过验证,因为它将始终在ChildValidator中应用规则 型号: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(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());
});
}
}
“比较生日,确保日期是<父母的生日”删除“在兜帽里喝果汁时不要对中南部造成威胁”: