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

使用.NET 6的ASP.NET Core MVC表单提交丢失小数分隔符问题

问题解决:ASP.NET Core MVC中Double类型字段表单提交丢失小数分隔符

问题原因

ASP.NET Core的模型绑定默认依赖服务器的区域文化设置,如果服务器文化不支持逗号作为小数分隔符(比如默认的en-US),提交带逗号的数值会被错误解析;同时即使用点分隔,若表单提交格式未被正确识别,也会导致小数分隔符被忽略,数值被当作整数处理后转为double(比如5.45或5,45被解析为545,最终显示为545.00)。

解决方案

方法1:配置全局区域文化支持

在Program.cs中配置应用支持目标区域(比如意大利语it-IT,原生支持逗号作为小数分隔符),让模型绑定自动适配对应格式:

var builder = WebApplication.CreateBuilder(args);

// 配置请求本地化选项
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("it-IT"), // 支持逗号小数分隔的区域
        new CultureInfo("en-US")  // 可选,保留英文区域支持
    };

    options.DefaultRequestCulture = new RequestCulture("it-IT");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
});

// 其他服务注册代码...

var app = builder.Build();

// 启用请求本地化中间件(需放在路由中间件之前)
app.UseRequestLocalization();

// 其他中间件配置...

app.Run();

方法2:为单个字段指定绑定规则

如果不想全局修改区域设置,可以在模型的Price字段上添加属性,指定解析格式并使用更精准的模型绑定器:

using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;

// ... 其他模型代码 ...

[Required(ErrorMessage = "Il campo è obbligatorio.")]
[Range(0, double.MaxValue, ErrorMessage = "Il prezzo non può essere negativo.")]
[DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)]
[BindProperty(BinderType = typeof(DecimalModelBinder))]
public double Price { get; set; }

额外建议:处理价格这类精确数值时,推荐将double改为decimal类型,避免浮点精度丢失问题,上述绑定规则同样适用于decimal字段。

方法3:前端统一提交格式

在表单提交前,将逗号分隔的小数转为点分隔,确保后端能正确解析:

document.querySelector('form').addEventListener('submit', function(e) {
    const priceInput = document.getElementById('Price');
    if (priceInput.value) {
        priceInput.value = priceInput.value.replace(',', '.');
    }
});

内容的提问来源于stack exchange,提问作者Thomas Youssef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:40:26