InputNumber 字段如果之前有无效输入,则不会从 EditContext 更新

问题描述 投票:0回答:1

我遇到了一个奇怪的问题。当用户第一次启动页面时,表单的 InputNumber 也设置为默认值 0。我可以将 EditContext 模型更改为任何数字,并且 InputNumber 字段会更新以反映它。但是,如果我手动输入表单并删除值,则会抛出验证错误,提示输入必须是数字。此时一切都有意义并且按预期执行。问题是,如果我再次使用正确的值更新编辑上下文,我希望 InputNumber 也会更新。然而,它什么也不做,仍然是空的。

这是我的输入编号字段

<div class="fieldsetFieldContainer">
    <label for="reqMileage">Mileage: </label>
    <InputNumber required class="form-control" id="reqMileage" @bind-Value="RequisitionToEditOrCreate.Mileage"></InputNumber>
    <ValidationMessage For="() => RequisitionToEditOrCreate.Mileage" />
</div>

我像这样设置编辑上下文值

<button id="autoFillButton" class="btn btn-primary" type="button" @onclick="AutoFill" title="Auto-Fill Unit Related Fields">🢂</button>
public void AutoFill()
{
    RequisitionToEditOrCreate.Mileage = tractorInformation.Mileage ?? 0;    
}

当按下按钮调用上面的行时,它会很好地更改输入编号,除非输入编号完全空白并抛出验证消息。

这几乎就像清空 InputNumber 会破坏绑定,直到我重新输入一个实数为止。

.net forms blazor .net-8.0
1个回答
0
投票

您的问题集中在可空性上。

我假设

RequisitionToEditOrCreate.Mileage
被声明为
int

当您将其空白时,

InputNumber
中会发生什么,内部值设置为
null
。这不是
RequisitionToEditOrCreate.Mileage
的有效值,因此
InputNumber
_parsingFailed
私有布尔值中识别该值,并向验证存储添加错误消息。

当您更改控件中的数字时,所有内容都会正确重置。

在您的情况下,您尝试通过渲染事件中的传入参数从外部重置数字。

InputNumber
并不是为了以这种方式从无效值中恢复而设计的。

最简单的解决方案是使

RequisitionToEditOrCreate.Mileage
可为空。解析错误消失了,因为
null
现在是一个有效值。这可能不可能或需要在其他地方进行更多工作[我不了解您的背景]。

这是一个演示页面:

@page "/"
@using System.ComponentModel.DataAnnotations

<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

<EditForm EditContext="_editContext">
    <DataAnnotationsValidator />
    <div class="mb-2">
        <InputNumber @bind-Value=_model.Mileage />
        <ValidationMessage For="() => _model.Mileage" />
    </div>

</EditForm>
<button class="btn btn-primary" @onclick=SetValue>Set</button>

<div class="bg-dark text-white m-2 p-2">
    <pre>Value = @_model.Mileage</pre>
</div>

@code{
    private Model _model = new();
    private EditContext? _editContext;

    // Use an EditContext so we can validate manually
    protected override void OnInitialized()
    {
        _editContext = new(_model);
        base.OnInitialized();
    }

    private void SetValue()
    {
        _model.Mileage = 20;
        _editContext?.Validate();
    }

    public class Model
    {
        // Nullable and Required
        [Required] public int? Mileage { get; set; }
    }
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.