如何使用FluentValidation实现不同类的字段大小比较验证
方案1:将依赖的inputModel实例传入验证器构造函数
这是最贴合你现有代码结构的实现方式,直接把需要对比的inputModel作为验证器的构造参数传入即可:
public class pointLoadFluentValidator : AbstractValidator<pointLoad> { // 构造函数新增inputModel类型的入参,接收用于对比的实例 public pointLoadFluentValidator(inputModel input) { RuleFor(x => x.pLoad) .NotEmpty() .NotNull() .LessThan(9999); RuleFor(x => x.pDist) .NotEmpty() .NotNull() // 替换原来的固定值99,用传入的input的span字段作为对比阈值 .LessThan(input.span) .WithMessage($"pDist值不能大于最大跨度{input.span}"); } }
使用验证器的时候,将对应业务场景下的inputModel实例传入即可:
// 示例代码 var currentInput = new inputModel { span = 15.5 }; var currentLoad = new pointLoad { pDist = 16, pLoad = 100 }; var validator = new pointLoadFluentValidator(currentInput); var validateResult = validator.Validate(currentLoad); // 此处validateResult.IsValid为false,符合预期
方案2:为包含两个类的父级模型编写验证规则
如果你的inputModel和pointLoad是同一个上层业务模型的属性,比如存在如下父模型:
public class BusinessModel { public inputModel InputInfo { get; set; } public pointLoad LoadInfo { get; set; } }
你可以直接给父模型写验证器,不需要修改现有的pointLoadFluentValidator:
public class BusinessModelValidator : AbstractValidator<BusinessModel> { public BusinessModelValidator() { // 可以先单独验证两个子模型 RuleFor(x => x.InputInfo).SetValidator(new InputModelValidator()); RuleFor(x => x.LoadInfo).SetValidator(new pointLoadFluentValidator()); // 新增跨子模型的对比验证 RuleFor(x => x.LoadInfo.pDist) .LessThan(x => x.InputInfo.span) .WithMessage("荷载距离不能大于当前设定的跨度值"); } }
注意事项
建议提前对inputModel的span字段做合法性校验,避免span为未赋值的默认值、负数等异常值,导致跨类验证逻辑出错。
内容的提问来源于stack exchange,提问作者ste4lth
相关产品推荐
相关产品推荐

