.NET Core 2.0 MVCプロジェクトで、ApplicationUserを拡張するための値を追加しました
public class ApplicationUser : IdentityUser
{
public string Name { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateUpdated { get; set; }
public DateTime LastLogin{ get; set; }
}
_LoginPartialで、デフォルトで取得するUserNameではなく、Nameを取得したいと思います。
@using Microsoft.AspNetCore.Identity
@using RioTintoQRManager.Models
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
@if (SignInManager.IsSignedIn(User))
{
@UserManager.GetUserName(User)
}
UserManagerを拡張する方法、またはUserManager.GetUserNameのようにビューで使用できる新しいメソッドを作成するにはどうすればよいですか?
ビューは、それ自体でバックエンドサービスを呼び出す必要はありません。必要なすべての情報を、@Model
またはViewBag
/ViewData
/Session
を介して提供する必要があります。
ただし、現在のユーザーを取得する必要がある場合は、次を使用できます。
var user = await UserManager.GetUserAsync(User);
string userName = user.Name;
ただし、独自のUserManager
が必要な場合は、次のようにする必要があります。
public class MyManager : UserManager<ApplicationUser>
{
public MyManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators, IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<ApplicationUser>> logger) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
{
}
public async Task<string> GetNameAsync(ClaimsPrincipal principal)
{
var user = await GetUserAsync(principal);
return user.Name;
}
}
そしてそれをサービスに追加します:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<SomeContext>()
.AddUserManager<MyManager>()
.AddDefaultTokenProviders();
次に、MyManager
のUserManager<ApplicationUser>
への参照を置き換える必要があります。
@ Camilo-Terevintoのおかげで、私は解決策を見つけることができました。私の中で_ Layout.cshtml
<span class="m-topbar__username Rust-text">
@{ var u = await UserManager.GetUserAsync(User); }
@u.Name
</span>