.NET Core 2.2项目中默认数值验证错误信息不符预期问题排查
嘿,这个问题我之前在项目里也碰到过!你看到的"ABC" is not valid其实是模型绑定失败时的默认提示,和[Required]这类数据注解触发的验证消息不是一回事儿。当用户输入的内容没法转换成decimal?类型时,ASP.NET Core的模型绑定系统会先抛出绑定错误,这部分的默认消息和数据注解的验证消息是分开配置的。
在.NET Core 2.2里,默认的模型绑定类型转换错误消息就是你看到的那种简短格式,要改成你预期的"The field ProductPrice must be a number",可以按下面的方法来配置:
最直接的解决方案:修改模型绑定错误消息
在Startup.cs的ConfigureServices方法里,给Mvc添加配置,覆盖默认的类型转换错误消息:
services.AddMvc() .AddMvcOptions(options => { // 替换类型转换失败的默认提示 options.ModelBindingMessageProvider.SetValueMustBeANumberAccessor( fieldName => $"The field {fieldName} must be a number"); });
这段代码里的SetValueMustBeANumberAccessor就是专门用来设置“值必须是数字”这类错误消息的,把字符串模板改成你想要的格式就行,{fieldName}会自动替换成模型上[Display]指定的名称(也就是"Product Price")。
补充说明
你模型里的[Required]注解管的是字段不能为空的情况——比如用户啥都不填就提交,这时候会触发[Required]的默认提示(类似"The Product Price field is required.")。而输入非数字内容时,触发的是模型绑定阶段的类型转换错误,这就是为啥你看到的是另一条消息,和[Required]没关系。
如果你还想做更自定义的验证逻辑,也可以写个自定义验证属性,但上面的方案1是最省事的,直接修改框架默认配置就能解决问题。
内容的提问来源于stack exchange,提问作者Arian Shahalami

