【问题标题】:Fluent validation Vary object validator according to the class it's used in流畅的验证根据使用的类改变对象验证器
【发布时间】:2015-07-21 03:52:28
【问题描述】:

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

我想根据使用它的父类覆盖应用于子类的验证器。下面是我的模型的简化版本。因此,我想在 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();
    }
}

【问题讨论】:

  • “比较生日以确保日期是

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


【解决方案1】:

如果您调试 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());
         });
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多