在Asp.net Core项目中,我使用下面的代码更改用户名和电子邮件。但是,在注销后,控制器中的“用户”属性不会更新。
obs。:这个“User”属性已经由控制器基类中的框架定义,它是一个“ClaimsPrincipal”类型。
public async Task<IActionResult> Create(EditViewModel viewModel)
{
if (ModelState.IsValid)
{
var model = await _userManager.FindByIdAsync(CurrentUser.Id);
model.UserName = viewModel.UserName;
model.Email = viewModel.Email;
await _userManager.UpdateAsync(model);
//THIS ONE STILL HAS OLD VALUES ==============================
Console.WriteLine(_userManager.GetUserName(User));
//THIS ONE HAS NEWER VALUES ==================================
model = await _userManager.FindByIdAsync(CurrentUser.Id);
Console.WriteLine(model.UserName);
...
我在视图中使用此“User”属性来显示用户信息,如下所示:
@inject UserManager<ApplicationUser> UserManager
...
<p>Hello: @UserManager.GetUserName(User)</p>
答案 0 :(得分:5)
这可能是因为您当前的用户将以类似于Claim(即内存)或Cookie的方式存储,以避免频繁点击数据库,因此为了获取新值,您需要注销并重新登录以刷新这些内容。
但是,您可以尝试通过调用RefreshSignInAsync()
方法来执行代码,该方法应该处理相同的行为:
// Update your User
await _userManager.UpdateAsync(model);
// signInManager is an instance of SignInManager<ApplicationUser> and can be passed in via
// dependency injection
await signInManager.RefreshSignInAsync(existingUser);