FluentValidation如何校验int/long类型数值的最大长度
FluentValidation对int/long数值类型做最大长度校验的可行方案
问题原因
MaximumLength 是FluentValidation内置的专用校验规则,仅支持字符串、集合、数组这类本身带有长度属性的类型,原生不支持int、long等数值类型直接调用,强行调用会出现编译错误或逻辑不生效的问题。
可行实现方案
方案1:转换为字符串后调用原生MaximumLength
最贴合原有编码习惯的写法,用内置Transform方法先把数值转为字符串,再调用熟悉的MaximumLength规则即可,兼容所有数值类型:RuleFor(x => x.PortCode) .NotEmpty() // 先将数值转为字符串,再执行长度校验 .Transform(val => val.ToString()) .MaximumLength(10) .WithMessage("端口编码最多为10位数字");注意:如果业务中允许负数,转字符串后负号会占1位长度,需要提前处理(比如取绝对值后再转字符串),避免校验逻辑和预期不符。
方案2:用数值范围规则校验(性能最优)
如果校验的是固定位数的正整数,可以直接通过数值范围限制实现,不需要做类型转换,性能更高。比如限制最多10位正整数,最大值就是9999999999:RuleFor(x => x.PortCode) .NotEmpty() // 限制数值在0到10位数字最大值之间 .InclusiveBetween(0, 9999999999) .WithMessage("端口编码最多为10位数字");注意:int类型的最大值为2147483647(仅支持到10位且首位不超过2的数字),如果需要支持完整10位任意数字,建议字段用long类型,或者选择方案1的字符串转换校验逻辑。
方案3:封装通用扩展方法复用
如果项目中有多处需要做数值长度校验,可以封装自定义的校验扩展方法,后续直接调用即可,不用重复写转换逻辑:public static class NumericValidationExtensions { // int类型扩展 public static IRuleBuilderOptions<T, int> MaxDigitLength<T>( this IRuleBuilder<T, int> ruleBuilder, int maxLength) { return ruleBuilder.Must(val => val.ToString().Length <= maxLength) .WithMessage($"输入数值长度不能超过{maxLength}位"); } // long类型扩展 public static IRuleBuilderOptions<T, long> MaxDigitLength<T>( this IRuleBuilder<T, long> ruleBuilder, int maxLength) { return ruleBuilder.Must(val => val.ToString().Length <= maxLength) .WithMessage($"输入数值长度不能超过{maxLength}位"); } } // 业务中直接调用 RuleFor(x => x.PortCode) .NotEmpty() .MaxDigitLength(10);
内容的提问来源于stack exchange,提问作者Mohm Zanaty
相关产品推荐
相关产品推荐

