#c# #blazor-server-side
#c# #blazor-на стороне сервера
Вопрос:
Я новичок в Blazor Server, исходя из фона в ASP.NET Веб-формы. У меня есть база данных, в которой хранятся вопросы и ответы для теста безопасности сотрудников, и я пытаюсь программно отобразить тестовые вопросы в разделе HTML моей страницы. При отладке я получаю ошибку Index Out of Range.
Связанный код:
@code {
private List<IForkLiftPerfTestContentModel> testquestion = new List<IForkLiftPerfTestContentModel>();
protected override async Task OnInitializedAsync()
{
testquestion = await testService.GetTestQuestions();
}
Когда я отлаживаю testquestion, он отображает данные правильно, как показано на рисунке:
Когда я пытаюсь отобразить элемент по индексу, основанному на нуле, я получаю индекс вне диапазона, хотя Intellisense не жалуется на мой код:
<td>
@testquestion[0].Topic
</td>
Очевидно, что я что-то упускаю, но я снова изучаю Blazor. Любая помощь приветствуется!
Комментарии:
1. Похоже, html отображается до вызова или возврата OnInitializedAsync, после чего testQuestion по-прежнему имеет значение null. Остерегайтесь этого, и это должно сработать.
2. В то же время на этой странице предлагается отложить рендеринг до тех пор, пока не будет ожидаться задача OnInitializedAsync …
3. Спасибо @jeroenh! Это правильно
Ответ №1:
Когда ваша страница blazor будет отображаться в первый раз, она еще не ожидает вашей асинхронной операции, она будет повторно отображаться после завершения этой операции. Это означает, что при первом рендеринге ваш testquestion
будет пустым — вот почему у вас индекс вне диапазона, поэтому вам нужно его обработать, скажем, например, «если тестовый вопрос пуст — отобразите загрузку»
Ответ №2:
Спасибо @Nikita! Это было идеально!
Я завернул форму редактирования в if /else следующим образом:
@if (testquestion.Count == 0)
{
<h4>Test Loading...</h4>
}
else
{ <Editform>.....</EditForm>