#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. Существует простое правило: избегайте асинхронной пустоты . Это избавит вас от множества проблем.