如何用FluentValidation验证用户输入为decimal类型?现有规则未生效
问题原因与解决方案
为什么你的验证规则没触发?
ASP.NET的模型绑定优先级高于FluentValidation:当用户传入非数值内容(比如"Density Factor")时,模型绑定器无法将字符串转换为decimal类型,会直接把DensityFactor设为decimal的默认值(0)。此时FluentValidation执行验证时,判断的是0.ToString()能否转成decimal——这显然永远为true,所以规则根本不会触发错误。
解决方案1:修改模型字段类型(推荐)
把模型里的DensityFactor改成string类型,让模型绑定能接收任意输入,再通过FluentValidation验证是否可转换为decimal:
// 模型修改 public string DensityFactor { get; set; } // FluentValidation规则 RuleFor(material => material.DensityFactor) .Must(input => decimal.TryParse(input, out _)) .WithMessage("密度系数必须是有效的数值");
之后在业务逻辑中,将验证通过的DensityFactor转换为decimal使用即可。
解决方案2:拦截模型绑定错误(不修改模型)
如果不想改动模型类型,可以直接检查ModelState.IsValid——模型绑定失败时,ModelState会自动包含转换错误。你可以在控制器中处理这个错误,或者自定义错误返回格式:
[HttpPost] public IActionResult YourAction(YourModel model) { if (!ModelState.IsValid) { // 提取模型绑定的错误,返回自定义格式 var errors = ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage)); return BadRequest(new { Message = "输入无效", Errors = errors }); } // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者lross33
相关产品推荐
相关产品推荐

