使用FluentValidation验证数值范围失效,求有效解决方法
问题描述
使用FluentValidation验证字段时,某字段的范围验证(自定义Must方法或内置InclusiveBetween)完全失效,断点调试发现验证步骤被直接跳过。
最后尝试的代码:
public override bool IsValid() { InlineValidator<CreateFunctionCommand> validator = new(); validator.RuleFor(validateField => validateField.HourlyRate) .Must(HourlyRateValidation) .WithErrorCode(GlobalizationConstants.BASIC0001) .WithMessage(GlobalizationConstants.BASIC0001.Resource()); return base.IsValid(); } private bool HourlyRateValidation(int hourlyRate) { return hourlyRate >= 10 && hourlyRate <= 100; }
问题根源
你创建了InlineValidator实例并定义了规则,但从未执行这个验证器的验证逻辑,直接返回了base.IsValid(),导致自定义规则完全没被触发。
可行解决方案
方案1:正确执行InlineValidator的验证
在IsValid方法中,需要调用validator.Validate获取验证结果,再和基类的验证结果合并:
public override bool IsValid() { var baseResult = base.IsValid(); if (!baseResult) return false; var inlineValidator = new InlineValidator<CreateFunctionCommand>(); inlineValidator.RuleFor(x => x.HourlyRate) .InclusiveBetween(10, 100) // 直接用内置方法更简洁 .WithErrorCode(GlobalizationConstants.BASIC0001) .WithMessage(GlobalizationConstants.BASIC0001.Resource()); var inlineResult = inlineValidator.Validate(this); // 传入当前实体实例 if (!inlineResult.IsValid) { // 将验证错误添加到当前验证器的错误集合中 foreach (var error in inlineResult.Errors) { this.Errors.Add(error); } return false; } return true; }
方案2:规范使用AbstractValidator(推荐)
如果你的类继承自AbstractValidator<CreateFunctionCommand>,不要重写IsValid方法,直接在构造函数中定义规则才是FluentValidation的标准用法:
public class CreateFunctionCommandValidator : AbstractValidator<CreateFunctionCommand> { public CreateFunctionCommandValidator() { // 其他字段验证规则... RuleFor(x => x.HourlyRate) .InclusiveBetween(10, 100) .WithErrorCode(GlobalizationConstants.BASIC0001) .WithMessage(GlobalizationConstants.BASIC0001.Resource()); } }
这种方式下,FluentValidation会自动执行所有定义的规则,不会出现规则被跳过的问题。
内容的提问来源于stack exchange,提问作者jvbs
相关产品推荐
相关产品推荐

