ASP.NET MVC C#中HTML提交decimal数值被识别为integer类型问题
ASP.NET MVC 表单提交decimal小数被识别为integer整数的核心原因
该问题由类型绑定环节的值解析偏差导致,常见触发场景如下:
- 区域文化(Culture)的小数分隔符不匹配
ASP.NET MVC 默认使用当前服务端线程的文化配置做值解析,如果当前文化使用,作为小数分隔符(如印尼语、德语等区域),前端传入的带.的小数(如15.7)会把.识别为无意义的千位分隔符直接丢弃,最终解析出的数值是15,表现为整数。反过来如果文化要求用.做小数位,前端传了带逗号的小数也会出现同类截断。 - 非强类型接收导致的默认类型推断
如果后端不是用强类型的decimal类型属性/参数接收值,而是用FormCollection、dynamic、object类型接值,默认模型绑定器会对传入的数字字符串做自动类型推断:如果字符串里没有小数分隔符,就会默认解析为int类型,不会自动转成decimal。 - 前端提交前的值被意外截断
常见触发情况:- 前端取表单值时错误使用
parseInt()做转换,直接丢弃小数部分 - 数字输入框
<input type="number">的step属性设置为1,部分浏览器会在提交时自动对输入值做取整处理 - 前端业务逻辑里做了取整运算(如
Math.round()、位运算)后才拼接提交参数,传给后端的本身就是整数值
- 前端取表单值时错误使用
- 自定义模型绑定/过滤器的逻辑错误
如果项目里实现了自定义的DefaultModelBinder、全局值过滤器或者参数转换中间件,逻辑里错误对数值类型做了int转换、小数截断,也会导致最终拿到的值是整数类型。 - 表单字段名不匹配导致绑定失败
如果前端表单字段的name属性和后端强类型模型的decimal属性名不一致,模型绑定器会给decimal属性赋默认值0,0本身是整数值,容易被误判为“被识别成了整数”。
内容的提问来源于stack exchange,提问作者Martin Simanjuntak
相关产品推荐
相关产品推荐

