При работе с шаблоном, размещенным в Blazor, в моем файле MainLayout.cshtml есть что-то вроде:
@inject UserInfo userInfo
@if(userInfo.Name == "bob")
{
<div class="login-panel">
<p>Hi Bob!</p>
</div>
}
else
{
<LoginPanel />
}
, а затем в отдельном файле Login.cshtml:
@inject UserInfo userInfo
async void Login()
{
userInfo.Name = "bob";
}
Но вход в систему не приводит к изменению "панели входа" в MainLayout.cshtml. Мне удалось заставить это работать, если все находится в одном файле, и я только проверяю, является ли конкретная переменная нулевой или нет (см. здесь), поэтому я предполагаю, что платформа Blazor имеет определенные критерии, которые запрещать страницу для переоценки таких блоков. Это точно? Если да, то как лучше всего провести повторную оценку?
Редактировать: я немного поиграл с этим, в конце концов обнаружил защищенную функцию-член StateHasChanged
, которая, как я полагаю, вызывается после завершения Init, поэтому предыдущий пример работает. Я думаю, что рабочее решение состоит в том, чтобы мой объект UserInfo
реализовал INotifyPropertyChanged
, а затем зарегистрировал обработчик изменений внутри MainLayout.cshtml для вызова StateHasChanged()
для представлений, которые необходимо обновлять при изменении статуса входа в систему.