我遇到了一个奇怪的问题。当用户第一次启动页面时,表单的 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 会破坏绑定,直到我重新输入一个实数为止。
您的问题集中在可空性上。
我假设
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; }
}
}