【问题标题】:FluentValidation: Using a parent property value in a child collection ruleFluentValidation:在子集合规则中使用父属性值
【发布时间】:2020-05-02 12:26:41
【问题描述】:

我有这个验证器:

 public class InputValidator : AbstractValidator<InputData>
{
    public InputValidator()
    { 
        RuleFor(inputData => inputData.Ucl).GreaterThan(0).....;

        RuleForEach(inputData => inputData.Loads).ChildRules(inputData => {            
              inputData.RuleFor(load => load.Position).GreaterThan(0).....); 
            });
... etc

但是:位置(在每个负载中)也必须小于 Ucl(在 InputData 中)。 如何为这种关系(父参数与子参数)制定规则?

【问题讨论】:

    标签: c# fluentvalidation


    【解决方案1】:

    我认为内联没有很好的方法。子规则不允许您传入父对象。 Must 和我认为 Custom (可能通过 context.ParentContext.InstanceToValidate )将允许您添加涉及父母和孩子的规则,但规则将反对集合而不是每个项目。更好的方法,以及我通常的做法是为您的 Load 实体创建一个子验证器:

    public class LoadValidator : AbstractValidator<Load>
    {
        public LoadValidator(InputData inputData)
        {
            RuleFor(load => load.Position)
                    .GreaterThan(0).WithMessage("Position must be greater than 0")
                    .LessThan(inputData.Ucl).WithMessage("Position must be less than Ucl");     
        }
    }
    

    这变得可重复使用并且更容易测试。那就用SetValidator来使用吧。

    public class InputDataValidator : AbstractValidator<InputData>
    {
        public InputDataValidator()
        {
            RuleFor(inputData => inputData.Ucl)
                .GreaterThan(0).WithMessage("Ucl must be greater than 0");
    
            RuleForEach(inputData => inputData.Loads)
                .SetValidator(inputData => new LoadValidator(inputData));
        }
    }
    

    Reusable property validators 可能是另一种实现方式,但对我来说,它必须是一个相当高级/通用的案例才能实现一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多