【发布时间】:2020-05-13 15:55:20
【问题描述】:
我有一个带有侧边栏的主布局,对于授权用户和非授权用户来说是不同的。我要更新的地方是这样的
<AuthorizeView>
<Authorized>
// Personal information matches in this component (it's just one more div this some code in it)
<UserInfo />
</Authorized>
<NotAuthorized>
<div class="sidebar-unathorized">
<span>
To get all privileges, <a href="/register"><strong>register</strong></a> or <a href="/login"><strong>login</strong></a> please
</span>
</div>
</NotAuthorized>
</AuthorizeView>
用户通过授权后,我希望他看到他的个人信息,所以在我的登录方法中,我做了一些类似
的操作public async void HandleValidSubmit()
{
...
((CustomAuthenticationStateProvider)authenticationStateProvider).AuthenticateUser(authorizedUser);
navigationManager.NavigateTo("/");
//here I want to update the layout
...
return;
}
在设置当前用户后,在我的 CustomAuthenticationStateProvider 中
NotifyAuthenticationStateChanged(Task.FromResult(new AuthenticationState(user)));
我希望这足以让所有基于授权的组件进行更新。
但事实并非如此。我尝试了 StateHasChanged() 方法,但可以理解的是它不能像那样工作,因为它只是更新触发它的组件。但是如果你在登录后手动重新加载页面就可以了。任何想法如何从代码更新布局?
【问题讨论】:
-
查看 Jeremy Likeness 的 this blog post。他讨论了一种创建包装器以基于模型更新调用 StateHasChanged 的方法,并且由于作用域服务被视为特定于用户的单例,因此您可以将其与 Jeremy 的 ViewRegion 组件一起使用来绑定事件并触发 StateHasChanged 进一步向上 DOM 树。
标签: c# authorization blazor