Blazor UserManager.GetUserAsync 抛出 NullReferenceException
Blazor UserManager.GetUserAsync throwing NullReferenceException
UserManager.GetUserAsync(authState.User)
抛出异常,除非 UserManager
已经被调用。
例如;
这会在 await UserManager.GetUserAsync(authState.User)
上引发 NullReferenceException
;
@ page "/"
@inject UserManager<ApplicationUser> UserManager
<AuthorizeView>
...
</AuthorizeView>
@code{
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
protected async override Task OnInitializedAsync()
{
var authState = await authenticationStateTask;
var currentUser = await UserManager.GetUserAsync(authState.User); // exception here
}
}
但这工作正常;
@ page "/"
@inject UserManager<ApplicationUser> UserManager
<AuthorizeView>
...
</AuthorizeView>
@code{
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
protected async override Task OnInitializedAsync()
{
var allUsers = UserManager.Users.ToList(); // hack
var authState = await authenticationStateTask;
var currentUser = await UserManager.GetUserAsync(authState.User); // this is now working OK
}
}
为什么我需要触发UserManager
才能使用GetUsersAsync
方法?
SignInManager<TUser>
和 UserManager<TUser>
在 Razor 组件中不受支持。
它们不受支持的原因是它们只能在服务器上使用。你的问题的真正原因是你没有提供 UserManager<>
用于注入。
注意:IdentityUser
是用户的基础 class。模板没有提供继承这个的ApplicationUser。
所以在Startup.cs
services.AddTransient<UserManager<ApplicationUser>>();
@page "/"
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager
@currentUser?.Email
@code{
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
ApplicationUser currentUser;
protected async override Task OnInitializedAsync()
{
var authState = await authenticationStateTask;
if (authState.User.Identity.IsAuthenticated)
{
currentUser = await UserManager.GetUserAsync(authState.User); // exception was here
}
}
}
UserManager.GetUserAsync(authState.User)
抛出异常,除非 UserManager
已经被调用。
例如;
这会在 await UserManager.GetUserAsync(authState.User)
上引发 NullReferenceException
;
@ page "/"
@inject UserManager<ApplicationUser> UserManager
<AuthorizeView>
...
</AuthorizeView>
@code{
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
protected async override Task OnInitializedAsync()
{
var authState = await authenticationStateTask;
var currentUser = await UserManager.GetUserAsync(authState.User); // exception here
}
}
但这工作正常;
@ page "/"
@inject UserManager<ApplicationUser> UserManager
<AuthorizeView>
...
</AuthorizeView>
@code{
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
protected async override Task OnInitializedAsync()
{
var allUsers = UserManager.Users.ToList(); // hack
var authState = await authenticationStateTask;
var currentUser = await UserManager.GetUserAsync(authState.User); // this is now working OK
}
}
为什么我需要触发UserManager
才能使用GetUsersAsync
方法?
SignInManager<TUser>
和 UserManager<TUser>
在 Razor 组件中不受支持。
它们不受支持的原因是它们只能在服务器上使用。你的问题的真正原因是你没有提供 UserManager<>
用于注入。
注意:IdentityUser
是用户的基础 class。模板没有提供继承这个的ApplicationUser。
所以在Startup.cs
services.AddTransient<UserManager<ApplicationUser>>();
@page "/"
@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager
@currentUser?.Email
@code{
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
ApplicationUser currentUser;
protected async override Task OnInitializedAsync()
{
var authState = await authenticationStateTask;
if (authState.User.Identity.IsAuthenticated)
{
currentUser = await UserManager.GetUserAsync(authState.User); // exception was here
}
}
}