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

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;
        }
        // 若输入无效(如多个小数点),可选择保留当前值或清空,按需调整
    }
}

关键说明

  1. 使用 text 类型输入:确保所有输入字符(包括小数点)都能被 oninput 事件捕获,避免浏览器对 number 输入的行为差异。
  2. 直接操作模型属性:去掉按值传递的参数,直接修改 model.MyDecimalValue,确保赋值能同步到模型。
  3. 安全解析:用 decimal.TryParse 替代 Parse,避免无效输入抛出异常;单独处理仅输入小数点的场景,符合业务逻辑需求。

内容的提问来源于stack exchange,提问作者Chris Foot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:10:12