ASP.NET MVC表单提交后decimal值小数点丢失变为百倍数如何解决
问题原因
核心原因是服务端模型绑定的区域文化(Culture)与客户端提交的小数格式不匹配:
- 多数地区的客户端输入小数时默认使用
.作为小数点分隔符,你通过开发者工具确认提交的带小数点的数值是正确的,说明前端传输逻辑没问题。 - 当服务端线程默认区域文化的小数分隔符不是
.时(例如欧洲部分地区文化使用,作为小数点,.作为千位分隔符),ASP.NET默认模型绑定器会将.识别为千位分隔符直接忽略,最终10.4就会被解析为104。 - 次要排查点:可检查
UpdateFormEntityCommand类中对应数值字段的类型是否被错误定义为int整型,不过如果是类型不匹配通常会得到10而非104,该场景概率较低。
解决方法
按优先级从高到低排列:
- 第一步先明确绑定源,避免取值混乱。给控制器方法的
command参数添加[FromForm]特性,明确指定从表单中取值,防止和路由、查询字符串等其他绑定源冲突:
[HttpPost] public async Task<ActionResult> FormApi([FromQuery] GetFormEntityQuery query, [FromForm] UpdateFormEntityCommand command) { // 原有逻辑 }
- 全局配置服务端请求文化,统一小数分隔符规则:
如果你使用的是ASP.NET Core MVC,在.NET 6+的Program.cs中添加如下配置,强制使用你需要的区域文化(示例为中文中国,默认.作为小数点):
如果你使用的是ASP.NET Framework MVC,可直接在using Microsoft.AspNetCore.Localization; using System.Globalization; var builder = WebApplication.CreateBuilder(args); // 注册请求本地化配置 builder.Services.Configure<RequestLocalizationOptions>(options => { var supportCulture = new CultureInfo("zh-CN"); options.DefaultRequestCulture = new RequestCulture(supportCulture); options.SupportedCultures = new List<CultureInfo> { supportCulture }; options.SupportedUICultures = new List<CultureInfo> { supportCulture }; }); // 其他服务注册逻辑... var app = builder.Build(); // 在路由中间件前启用请求本地化 app.UseRequestLocalization(); app.UseRouting(); // 其他中间件配置...web.config的<system.web>节点下添加全局文化配置:<system.web> <globalization culture="zh-CN" uiCulture="zh-CN" /> </system.web> - 给前端输入框添加
step属性,明确允许输入小数,避免部分浏览器默认做取整限制:
<input type="number" step="0.01" asp-for="ModelFieldName" />
- 特殊场景下可自定义decimal类型的模型绑定器,强制使用固定文化解析数值,不受全局配置影响。
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

