You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:15:00