ASP.NET中EditorFor控件无法输入小数、加step属性后提交值为null问题
问题根因
你遇到的提交后Sum为null(实际为模型绑定失败后的异常值/默认值)是两个核心原因共同导致的:
[DisplayFormat]的ApplyFormatInEditMode = true配置和type="number"的输入框格式要求冲突,渲染出的初始值不符合浏览器数字输入框的规范- 服务端区域文化的小数分隔符和浏览器提交的数字格式不匹配,导致模型绑定失败
解决步骤
步骤1:调整模型特性配置
如果不需要在编辑状态强制格式化展示,直接将ApplyFormatInEditMode设为false即可:
[DisplayFormat(DataFormatString = "{0:0.00}", ApplyFormatInEditMode = false)] public decimal Sum { get; set; }
如果需要保留编辑时的格式化展示,可以去掉手动指定的type="number"属性,改用文本输入配合前端校验。
步骤2:修正视图控件写法
优先改用TextBoxFor代替EditorFor,避免内置Editor模板和你自定义属性的冲突,同时确保step属性加引号,max属性正确转换为字符串:
@Html.TextBoxFor(model => model.Sum, new { @class = "form-control", @placeholder = "Kwota", @type = "number", @min = "0.00", @max = TempData["MaxValue"]?.ToString(), @step="0.01" })
步骤3:修复小数格式模型绑定问题(可选,针对非中文区域站点)
如果你的站点使用的区域文化(比如示例中的波兰语pl-PL)默认用逗号作为小数分隔符,需要配置ASP.NET支持识别点作为小数分隔符,.NET Core/.NET 5+可在Program.cs里添加如下配置:
builder.Services.Configure<RequestLocalizationOptions>(opts => { var supportedCultures = new[] { new CultureInfo("pl-PL") }; opts.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("pl-PL"); opts.SupportedCultures = supportedCultures; opts.SupportedUICultures = supportedCultures; // 配置数字解析允许点作为小数分隔符 supportedCultures[0].NumberFormat.NumberDecimalSeparator = "."; });
步骤4:验证模型状态
在POST接口里先检查ModelState.IsValid,如果绑定失败可以直接查看到具体的错误信息,快速定位问题:
[HttpPost] public IActionResult TransferForm(Transfer model) { if(!ModelState.IsValid) { // 可打断点查看ModelState的错误明细 return View(model); } // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者Pawlinho
相关产品推荐
相关产品推荐

