我最近从MVC5转到了.NET Core 2.1(MVC)。谁能帮我这个忙。
我有ApplicationUser
,并且已经扩展了模型/表来存储用户的FirstName
。
在视图中,我希望能够输出当前用户的名字值。
视图中的User
是一个ClaimsPrincipal
,因此我需要进入数据库以获取需要或访问UserManager
的值。
现在,我知道我可以在控制器中得到它,但是我不我想创建一个JQuery调用来在每次需要它时都进行抓取。
我想要的是能够在服务器端访问它,最好是通过静态帮助器类进行访问。
在MVC5中,我将有一个帮手来完成这项工作,没有问题。例如:
public static string GetCurrentUserFirstName()
{
string _usrRef = HttpContext.Current.User.Identity.GetUserId();
var user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(_usrRef);
return user.FirstName;
}
但是,.NET Core不能那样工作。
在控制器中我可以说:
var user = await _userManager.GetUserAsync(User);
string firstName = user.FirstName;
或者我可以使用带有连接字符串的Dapper通过呼叫转到DB。
我无法通过构造函数将UserManager
或ConnectionStrings
注入到助手中,因为它是静态的。
在此静态助手中是否可以访问其中任何一个?
让您获得最大收益的小变化!
答案 0 :(得分:1)
感谢@Kirk Larkin-我找到了解决方案。
我不得不承认,感觉有点麻烦,不得不传递一些东西以获取对它们的访问权限,但这是一个很好的可行的解决方案。
视图:
@using Microsoft.AspNetCore.Identity
@using MyApplication.Helpers
@inject UserManager<ApplicationUser> UserManager
<div>
@await MyHelper.GetLoggedInUserFirstName(UserManager, User)
</div>
MyHelper
文件:
public static async Task<string> GetLoggedInUserFirstName(UserManager<ApplicationUser> userManager, ClaimsPrincipal user)
{
string output = "";
try
{
var currentUser = await userManager.GetUserAsync(user);
if(currentUser!=null)
{
output = currentUser.FirstName ?? currentUser.Email;
}
}
catch(Exception e) { }
return output;
}