Как сбросить пользовательские ошибки проверки при использовании editform на странице бритвы - PullRequest
3 голосов
/ 29 марта 2020

У меня есть форма редактирования с использованием editcontext:

    <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. Но это, похоже, тоже не дает эффекта. Сообщение об ошибке не исчезает, поэтому HandleValidSubmit также не вызывается.

Ответы [ 3 ]

3 голосов
/ 31 марта 2020

Я решил это, создав новый EditContext при валидации-сбросе. Поэтому я просто добавил следующую строку в метод ResetValidation:

  _editContext = new EditContext(_foodTruck);

Но, честно говоря: это не так. Так что я оставлю это открытым для лучшего ответа (надеюсь).

1 голос
/ 30 апреля 2020

У меня была такая же проблема. Я не мог найти простое решение. Обход, аналогичный приведенному ниже, работал для меня.

Измените EditForm следующим образом -

<EditForm EditContext="_editContext" OnSubmit="HandleSubmit">

@ Code Block

EditContext _editContext;

ValidationMessageStore msgStore;

FoodTruck _foodTruck= new FoodTruck();

protected override void OnInitialized()
{
    _editContext = new EditContext(_foodTruck);
    msgStore = new ValidationMessageStore(_editContext);
}

void HandleSubmit()
{
    msgStore.Clear();
    if(_editContext.Validate()) // <-- Model Validation
    {
        if (_foodTruck.StartDelivery >= _foodTruck.EndDelivery) //<--Custom validation
        {
            msgStore = new ValidationMessageStore(_editContext);
            msgStore.Add(_editContext.Field("EndDelivery"), "Bad time entered");
        }
    }
}
0 голосов
/ 29 марта 2020

Добавьте this.StateHasChanged () в конце действия события, чтобы он мог снова визуализировать элементы пользовательского интерфейса и удалить сообщение проверки.

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();
     this.StateHasChanged(); //this line
  }
 if (!_editContext.Validate()) return;
}

для другого

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

пожалуйста, дайте мне знать, если это работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...