首页 > 解决方案 > 在 blazor razor 页面中使用 editform 时如何重置自定义验证错误

问题描述

我有一个使用编辑上下文的编辑表单:

    <EditForm OnValidSubmit="HandleValidSubmit" EditContext="_editContext" Context="auth">
      <DataAnnotationsValidator />
      <input type="time" @bind-value="_foodTruck.EndDelivery" @onkeydown="@(q=>ResetValidation("EndDelivery"))" >
        <ValidationMessage For="() => _foodTruck.EndDelivery" />
      <input type="time" @bind-value="_foodTruck.StartDelivery" @onkeydown="@(q=>ResetValidation("StartDelivery"))" >
        <ValidationMessage For="() => _foodTruck.StartDelivery" />
      <input class="btn btn-default" type="submit" value="save" />
    </EditForm>

我在 HandleValidSubmit 中做了一些自定义验证:

EditContext _editContext = new EditContext(_foodTruck);
private async void HandleValidSubmit()
{
  var messageStore = new ValidationMessageStore(_editContext);
  if (_foodTruck.StartDelivery >= _foodTruck.EndDelivery)
  {
    messageStore.Add(_editContext.Field("EndDelivery"), "Bad time entered");
    _editContext.NotifyValidationStateChanged();
  }
 if (!_editContext.Validate()) return;
}

现在发生的是我的自定义错误(“输入错误时间”)显示在正确的位置。唯一的问题是:当我更改值时,该错误不会消失。因此,如果我单击提交按钮,则永远不会再次调用 HandleValidSubmit。

我还尝试在修改字段时清空验证错误:

   protected void ResetValidation(string field)
    {
        var messageStore = new ValidationMessageStore(_editContext);        
        messageStore.Clear(_editContext.Field(field));
        messageStore.Clear();
        _editContext.NotifyValidationStateChanged();
    }

这是由 调用的onkeydown。但这似乎也没有效果。Errormessage 不会消失,因此HandleValidSubmit也不会被调用。

标签: validationrazorblazorblazor-server-side

解决方案


我通过在验证重置上创建一个新的 EditContext 解决了这个问题。所以我只是在 ResetValidation-Method 中添加了以下行:

  _editContext = new EditContext(_foodTruck);

但说实话:这感觉不对。因此,我将保持开放状态,以便获得更好的答案(希望如此)。


推荐阅读