Blazor中InputNumber输入小数点时ChangeEventArgs.Value为空(仅Firefox)
问题分析与解决方案
问题根源
Firefox 对 <input type="number"> 的 oninput 事件处理逻辑和 Chrome 不一致:输入小数点时,Firefox 判定当前输入不是有效数字,会将 ChangeEventArgs.Value 置为空字符串;而 Chrome 会保留小数点字符。另外你的代码存在参数传递问题:valToSet 是值类型参数,函数内的赋值不会同步到原模型的 MyDecimalValue 属性。
解决方案
改用 <input type="text"> 替代 InputNumber,绕过浏览器对 number 输入的差异处理,同时修正属性赋值逻辑:
修改后的 Razor 代码
<EditForm EditContext="purchaseOrderEditContext"> <label for="invoice-total">Invoice Total</label> <input type="text" id="invoice-total" value="@model.MyDecimalValue?.ToString()" @oninput="SetDecimalOnInput" /> </EditForm>
修正后的处理函数
@code { public void SetDecimalOnInput(ChangeEventArgs e) { var inputText = e.Value?.ToString() ?? string.Empty; // 处理仅输入小数点的特殊情况 if (inputText == ".") { model.MyDecimalValue = null; // 也可根据需求设为 0m return; } // 安全解析输入内容 if (decimal.TryParse(inputText, out decimal parsedValue)) { model.MyDecimalValue = parsedValue; } else if (string.IsNullOrWhiteSpace(inputText)) { model.MyDecimalValue = null; } // 若输入无效(如多个小数点),可选择保留当前值或清空,按需调整 } }
关键说明
- 使用 text 类型输入:确保所有输入字符(包括小数点)都能被
oninput事件捕获,避免浏览器对 number 输入的行为差异。 - 直接操作模型属性:去掉按值传递的参数,直接修改
model.MyDecimalValue,确保赋值能同步到模型。 - 安全解析:用
decimal.TryParse替代Parse,避免无效输入抛出异常;单独处理仅输入小数点的场景,符合业务逻辑需求。
内容的提问来源于stack exchange,提问作者Chris Foot
相关产品推荐
相关产品推荐

