在 ASP.NET MVC 中,我处理了
session_start
事件来加载用户详细信息并将其存储在会话变量中,因此我不必在每次页面加载时查询数据库。
我正在尝试弄清楚如何在 .NET 8 上的 Blazor 中执行此操作。
我觉得
App.razor
是放置代码的好地方,因为它是在每次页面加载时执行的 - 但我不知道这是否是最佳实践?
我在
App.razor
(服务器代码)中的代码如下所示(我正在使用 Windows 身份验证):
@code {
protected override async Task OnInitializedAsync()
{
UserDetails details;
var user = (await AuthenticationStateProvider.GetAuthenticationStateAsync()).User;
var userId = user.Identity?.Name?.ToLower();
var result = await BrowserStorage.GetAsync<UserDetails>(userId);
if (result.Success)
{
details = (UserDetails)result.Value;
}
else
{
GetUserDetailsQuery query = new GetUserDetailsQuery();
query.UserLogin = await getUserId();
details = query.Handle();
await BrowserStorage.SetAsync(userId, details);
}
}
}
但是我收到错误:
InvalidOperationException:此时无法发出 JavaScript 互操作调用。
你们是怎么解决这个问题的?您是否在每次页面加载时查询数据库以获取相同的信息?
JavaScript 调用仅在组件完全初始化后才可用。因此,仅应在渲染完成后调用互操作。即调用 OnAfterRender 之后的任何时间,并且这不是第一次渲染。