You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC表单提交后decimal值小数点丢失变为百倍数如何解决

问题原因

核心原因是服务端模型绑定的区域文化(Culture)与客户端提交的小数格式不匹配:

  1. 多数地区的客户端输入小数时默认使用.作为小数点分隔符,你通过开发者工具确认提交的带小数点的数值是正确的,说明前端传输逻辑没问题。
  2. 当服务端线程默认区域文化的小数分隔符不是.时(例如欧洲部分地区文化使用,作为小数点,.作为千位分隔符),ASP.NET默认模型绑定器会将.识别为千位分隔符直接忽略,最终10.4就会被解析为104。
  3. 次要排查点:可检查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中添加如下配置,强制使用你需要的区域文化(示例为中文中国,默认.作为小数点):
    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();
    
    // 其他中间件配置...
    
    如果你使用的是ASP.NET Framework MVC,可直接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:39:04