我正在尝试访问 Blazor Server .NET 8 应用程序中当前登录用户的 ApplicationUser 。我在 /Account/ISP 中添加了一个名为 Index.razor 的新页面
@page "/Account/ISP"
@using Microsoft.AspNetCore.Identity
@using WebApp.Components.Account.Shared
@using WebApp.Data
@inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager
@inject IdentityUserAccessor UserAccessor
@inject IdentityRedirectManager RedirectManager
@inject ApplicationDbContext DbContext
@code {
private ApplicationUser user = default!;
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
protected override async Task OnInitializedAsync()
{
user = await UserAccessor.GetRequiredUserAsync(HttpContext);
}
}
在这里,我尝试复制让我的用户进入
Account/Manage
的逻辑,它在创建的 Blazor 模板中运行良好。登录后,我单击菜单项导航到此页面,在这里我得到 NullReferenceException
,没有堆栈跟踪。我做错了什么?
“httpcontext”仅在 SSR 渲染模式下可用。使用InteractiveServer 时其值为null。如果您检查模板,您会发现它将所有启动的页面设置为
App.razor
中的 SSR 渲染模式,如下所示:
...
<Routes @rendermode="RenderModeForPage" />
...
@code {
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
private IComponentRenderMode? RenderModeForPage => HttpContext.Request.Path.StartsWithSegments("/Account")
? null
: InteractiveServer;
}
(当渲染模式设置为null时,就是使用SSR)
参考:https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-8.0#area-folder-of-static-ssr-components