FluentValidation如何校验三个值中至少一个大于0
FluentValidation 多字段至少一个满足条件的实现方案
When/Otherwise是为二分支逻辑设计的语法,单个When仅支持配套一个Otherwise分支,无法叠加多分支,本身就不适合实现三字段至少一个大于0的校验需求,可直接使用以下两种方案实现:
方案一:模型级自定义规则(推荐)
直接对整个校验模型编写判断逻辑,代码最简洁,适合统一返回错误提示的场景:
RuleFor(c => c) .Must(c => (c.var1 ?? 0) > 0 || (c.var2 ?? 0) > 0 || (c.var3 ?? 0) > 0) .WithMessage("var1、var2、var3三个字段中至少需要有一个值大于0");
逻辑说明:通过空合并运算符??处理可空字段的null值,字段为null时按0计算,只要任意一个字段的值大于0就通过校验,完全覆盖null判断、数值判断的需求。
方案二:分字段条件校验
如果需要把错误信息关联到具体字段(适配表单逐字段展示错误的场景),可以给每个字段单独配置生效条件,不需要使用Otherwise:
// 其余两个字段都不满足要求时,var1必须大于0 RuleFor(c => c.var1) .GreaterThan(0) .When(c => (c.var2 ?? 0) <= 0 && (c.var3 ?? 0) <= 0) .WithMessage("var1、var2、var3三个字段中至少需要有一个值大于0"); // 其余两个字段都不满足要求时,var2必须大于0 RuleFor(c => c.var2) .GreaterThan(0) .When(c => (c.var1 ?? 0) <= 0 && (c.var3 ?? 0) <= 0) .WithMessage("var1、var2、var3三个字段中至少需要有一个值大于0"); // 其余两个字段都不满足要求时,var3必须大于0 RuleFor(c => c.var3) .GreaterThan(0) .When(c => (c.var1 ?? 0) <= 0 && (c.var2 ?? 0) <= 0) .WithMessage("var1、var2、var3三个字段中至少需要有一个值大于0");
这个写法的逻辑是:只有当另外两个字段都不符合大于0的要求时,才会校验当前字段必须大于0,最终实现三个字段至少一个满足条件的效果。
内容的提问来源于stack exchange,提问作者Dayton Rumbold
相关产品推荐
相关产品推荐

