Stop Fluent Validation on first failure

前端 未结 3 409
暖寄归人
暖寄归人 2021-02-04 02:12

i\'m defining a validation for my Request objects. I would like the validator to stop on the very first failure, not only the one on the same chain. In the example below, if my

相关标签:
3条回答
  • 2021-02-04 03:06

    Just add SetValidator before running the rules that depend on them, using a Custom condition:

    //if InpatOrderImportValidatorBllNode fail ,the custom method cannot be executed
    RuleFor(x => x).Cascade(CascadeMode.StopOnFirstFailure)
                   .SetValidator(new InpatOrderImportValidatorBllNode())
                   .Custom((input, context) => {          
                      context.AddFailure(new ValidationFailure("DrugTypeName", "fail"));
                   });
    
    0 讨论(0)
  • 2021-02-04 03:12

    Just check for null before running the rules that depend on them, using a When condition.

    this.CascadeMode = CascadeMode.StopOnFirstFailure;
    RuleFor(x => x.TechnicalHeader).NotNull().WithMessage("Header cannot be null");
    
    // Ensure TechnicalHeader is provided
    When(x => x.TechnicalHeader != null, () => {
        RuleFor(x => x.TechnicalHeader.Userid).NotEmpty().WithMessage("Userid cannot be null or an empty string");
        RuleFor(x => x.TechnicalHeader.CabCode).GreaterThan(0).WithMessage("CabCode cannot be or less than 0");
        RuleFor(x => x.TechnicalHeader.Ndg).NotEmpty().WithMessage("Ndg cannot be null or an empty string");
    });
    
    0 讨论(0)
  • 2021-02-04 03:14

    You can use DependentRules.

    RuleFor(object => object.String)
        .NotNull()
        .DependentRules(() =>
        {
            RuleFor(object => object.String)
                .NotEmpty()
                .Matches("^[A-Z]{3}$");
        });
    

    Then you dont duplicate validation code.

    You can even add an extension method for no duplicating the RuleFor.

        public static IRuleBuilderOptions<T, TProperty> DependentRules<T, TProperty>(
            this IRuleBuilderOptions<T, TProperty> currentRule, 
            Action<IRuleBuilderOptions<T, TProperty>> action)
        {
            return currentRule.DependentRules(() => action(currentRule));
        }
    

    So the definitve code:

    RuleFor(object => object.String)
        .NotNull()
        .DependentRules(currentRule =>
        {
            currentRule
                .NotEmpty()
                .Matches("^[A-Z]{3}$");
        });
    
    0 讨论(0)
提交回复
热议问题