Элементы пользовательского интерфейса обновляются только при удалении фокуса от исходной кнопки/ввода

#asp.net-core #blazor #razor-pages #blazor-webassembly

#asp.сетевое ядро #блейзор #бритвенные страницы #blazor-веб-сборка

Вопрос:

У меня возникла проблема, когда я нажимал кнопку, и с сервера поступал ответ, но пользовательский интерфейс не обновлялся для отображения ответа, который я для него установил, пока я не начну взаимодействовать с чем-то другим. Кажется, я не могу понять, в чем причина этого. Я просматривал код, вносил изменения в макет пользовательского интерфейса, но, казалось, ничего не работало. У меня есть gif здесь, чтобы лучше продемонстрировать. Я пробовал использовать StateHasChanged , но это, похоже, тоже не сработало

введите описание изображения здесь

Страница бритвы

 lt;EditForm Model="@AssignUser" OnValidSubmit="@AddUserToProject"gt;  @* lt;DataAnnotationsValidator /gt;*@ lt;div class="form-group"gt;  lt;label class="custom-control-label"gt; Assign Users lt;/labelgt;  lt;InputText placeholder="Username" id="inlineFormInputGroup" type="email" @bind-Value="@AssignUser.UserName" class="form-control" /gt;   lt;button type="submit" class="btn btn-success"gt;Addlt;/buttongt; lt;/divgt; lt;/EditFormgt; //display messages depending on outcome @if (userNotFoundError == true) {  lt;div class="alert alert-danger" role="alert"gt;  User could not be found  lt;/divgt; }  @if (userExistsAlready == true) {  lt;div class="alert alert-danger" role="alert"gt;  User is already on the project  lt;/divgt; }  

Добавить пользователя в функцию проекта

 private bool userNotFoundError = false; private bool userExistsAlready = false; private async void AddUserToProject() {  try  {  var response = await Http.PutAsJsonAsync($"Projects/add/User/{AssignUser.UserName}/{projectItem.ProjectId}", AssignUser);   // Attempt add adding someone who is already on the project?  if (response.StatusCode == HttpStatusCode.Forbidden)  {  StateHasChanged();   if (userNotFoundError == true)  {  userNotFoundError = false;  }  userExistsAlready = true;     } // Attempt at adding someone who does not exist as a user?  else if (response.StatusCode == HttpStatusCode.BadRequest)  {  StateHasChanged();   if (userExistsAlready == true)  {  userExistsAlready = false;  }  userNotFoundError = true;  }  else  {  var content = await response.Content.ReadAsStringAsync();  var userobject = JsonConvert.DeserializeObjectlt;ApplicationUsergt;(content);  response.EnsureSuccessStatusCode();  Navigation.NavigateTo("/projects");  userNotFoundError = false;  userExistsAlready = false;  StateHasChanged();  }   }  catch (Exception e)  {  userNotFoundError = true;  } }  

Добавьте пользовательскую функцию в контроллер

 [HttpPut("add/User/{userName}/{projID}")] public async Tasklt;IActionResultgt; AddUserToProject(string userName, Guid projID) {   var project = _context.Projects.Include(u =gt; u.AssignedUsersToProject).FirstOrDefault(p =gt; p.ProjectId.ToString().Equals(projID.ToString()));   try  {  var user = _context.Users.First(u =gt; u.UserName.Equals(userName));   if (!project.AssignedUsersToProject.Any(u =gt; u.UserName.Equals(user.UserName))) {   project.AssignedUsersToProject.Add(user);   } else  {  return Forbid();  }  }  catch (InvalidOperationException)  {  return BadRequest();  }   try  {  await _context.SaveChangesAsync();  }  catch (DbUpdateConcurrencyException)  {  if (!ProjectExists(projID))  {  return NotFound();  }  else  {  throw;  }  }   return NoContent(); }  

Комментарии:

1. Вопрос почти завершен, но мы не видим, где/как вы показываете ошибку. Это может иметь значение.

2. Спасибо за предложение. Я обновил сообщение, чтобы показать это.

3. Код ошибки выглядит нормально — тогда, должно быть, это была просто асинхронная пустота.

Ответ №1:

Изменить

 private async void AddUserToProject()  

Для

 private async Task AddUserToProject()  

и это должно сработать.

Затем вы также можете удалить все эти StateHasChanged() звонки, они больше не служат никакой цели.

Блейзор не знает, когда an async void будет завершен. Когда вы используете async Task метод, Blazor автоматически перенаправит ваш пользовательский интерфейс, когда метод будет завершен.

Но я подозреваю, что есть еще одна проблема с отображением ошибки. Вызовы StateHasChanged() должны были «исправить» async void для большинства ветвей.

Комментарии:

1. Существует простое правило: избегайте асинхронной пустоты . Это избавит вас от множества проблем.