ASP.NET Core中输入带小数点的decimal值变为零的问题求助
解决ASP.NET Core MVC中Decimal类型参数小数输入绑定为0的问题
核心原因
问题源于模型绑定的文化区域不匹配,以及数据注解的类型设置与实际需求不符,导致客户端输入的小数格式无法被服务器正确解析,最终默认赋值为0。
解决方案
1. 修正模型的数据注解
[DataType(DataType.Currency)] 是针对货币类型的注解,会干扰重量类普通decimal值的绑定逻辑,替换为数值类型适配的配置:
[Required] [DataType(DataType.Decimal)] [Display(Name = "Waga [kg]")] [DisplayFormat(DataFormatString = "{0:0.00}", ApplyFormatInEditMode = true)] // 明确小数格式,编辑模式生效 public decimal Weight { get; set; }
2. 配置服务器端的文化支持
确保服务器端能识别客户端使用的小数分隔符(逗号/点号),在Program.cs中添加区域配置:
var builder = WebApplication.CreateBuilder(args); // 添加支持的文化,按需选择逗号分隔(如pl-PL)或点号分隔(如en-US) builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { new CultureInfo("pl-PL"), new CultureInfo("en-US") }; options.DefaultRequestCulture = new RequestCulture("pl-PL"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); // ... 其他服务配置 var app = builder.Build(); // 启用区域中间件 app.UseRequestLocalization(); // ... 其他中间件配置
3. 优化前端输入控件
给输入控件添加区域属性,让浏览器匹配服务器的格式处理规则:
<label asp-for="Input.Weight"></label> <input asp-for="Input.Weight" type="number" step="any" min="20" class="form-control" lang="pl" /> <span asp-validation-for="Input.Weight" class="text-danger"></span>
- 若使用点号作为小数分隔符,将
lang="pl"替换为lang="en"即可。
内容的提问来源于stack exchange,提问作者Aleksandra Wenus
相关产品推荐
相关产品推荐

