我正在尝试根据此处的这篇文章为一系列复选框创建一个ViewComponent:
https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components?view=aspnetcore-2.2
这个答案在这里: https://stackoverflow.com/a/42853705/2300177
对于我尝试做的事情来说,这似乎是一个完美的案例。但是,我已经创建了ViewComponent来包含标识UserManager
以获取userId
:
using BlogPlayground.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace BlogPlayground.ViewComponents
{
public class LatestArticlesViewComponent : ViewComponent
{
private readonly ApplicationDbContext _context;
private readonly UserManager<IdentityUser> _userManager;
public LatestArticlesViewComponent(ApplicationDbContext context, UserManager<IdentityUser> userManager)
{
_context = context;
_userManager = userManager;
}
public async Task<IViewComponentResult> InvokeAsync()
{
string userId = _userManager.GetUserId(User);
var lastArticles = await _context.Article
.OrderByDescending(a => a.CreatedDate)
.Take(howMany)
.ToListAsync();
return View(lastArticles);
}
}
}
问题是当我拨打此行时:
string userId = _userManager.GetUserId(User);
我遇到User
的错误消息,内容为:
无法从“ System.Security.Principal.IPrincipal”转换为 'System.Security.Claims.ClaimsPrincipal'
这个精确的代码在我所有的控制器中都有效,我什至不知道User
的来源。看起来像魔术,但我猜是Identity固有的某个地方吗?还是我只是想念控制器中包含的东西? (我在控制器中搜索了“用户”,但无法将其链接到任何内容。)
我正在使用Pomelo MySQL nuget软件包吗?我不会这样。
任何人都知道我缺少什么以及如何消除此错误吗?
更新:似乎可以使用它(至少它消除了错误):
string userId = _userManager.GetUserId(Request.HttpContext.User);
是同一件事吗?我是否缺少using语句? Visual Studio(2017)通常会向我提示我所缺少的内容。
答案 0 :(得分:0)
请确保在services.AddDefaultIdentity
中配置了app.UseAuthentication
并启用了Identity
Startup
。
需要这样做才能通过dependency injection
将其提供给应用程序,因此您可以将其加载到LatestArticlesViewComponent
中。
在此处查看详细信息:Introduction to Identity on ASP.NET Core