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

.NET 6 MVC项目向PostgreSQL提交小数数据异常求助

解决.NET 6 MVC小数提交异常问题

问题根源

你遇到的问题是区域文化不匹配导致的模型绑定错误:

  • 输入10.50被解析为1050:因为服务器默认文化(如en-US)将.视为千位分隔符,直接忽略后得到整数
  • 输入10,50触发验证错误:因为服务器文化期望.作为小数点,无法识别逗号格式的小数

解决方案

1. 配置全局请求文化(推荐)

在Program.cs中添加区域文化配置,让应用适配你所在地区的数字格式(以土耳其文化tr-TR为例,该文化用逗号作为小数点):

var builder = WebApplication.CreateBuilder(args);

// 配置区域文化支持
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("tr-TR"), // 适配逗号小数点格式
        new CultureInfo("en-US")  // 可选:保留英文文化兼容
    };

    options.DefaultRequestCulture = new RequestCulture("tr-TR");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
});

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

var app = builder.Build();

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

// 其他中间件配置...
app.Run();

2. 优化模型属性配置

在Product类的UnitPrice属性上补充格式化与验证属性,确保前后端格式统一:

[Required]
[Range(0.01, 999999999, ErrorMessage = "价格必须大于0.00")]
[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:N2}", ApplyFormatInEditMode = true)]
public decimal UnitPrice { get; set; }
  • DisplayFormat指定显示与编辑时保留两位小数,ApplyFormatInEditMode确保编辑框显示格式化后的数值
  • DataType(DataType.Currency)让前端自动适配区域文化的货币输入格式

3. 前端输入框优化

在Add.cshtml的UnitPrice输入框添加inputmode="decimal",引导浏览器显示适配区域的小数键盘:

<div class="mb-3">
    <label asp-for="Product.UnitPrice"></label>
    <input asp-for="Product.UnitPrice" class="form-control" placeholder="Unit Price" inputmode="decimal" />
    <span asp-validation-for="Product.UnitPrice"></span>
</div>

4. 数据库映射验证

你的PostgreSQL表中UnitPrice字段使用numeric类型是正确的,它与.NET的decimal类型完全兼容,无需修改数据库结构。

测试验证

配置完成后:

  • 输入10,50会被正确解析为10.50(对应.NET的decimal值)
  • 提交后数据将正确保存到PostgreSQL的numeric字段中

内容的提问来源于stack exchange,提问作者Egemen Uzun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:15:41