我有一个可以在多个地方重复使用的课程。它有一个应用它的默认验证器,它具有以下属性,[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 :(得分: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());
});
}
}