.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
相关产品推荐
相关产品推荐

