我正在尝试为core 2.2构建一个用户帮助程序,以便更轻松地获取当前用户信息。
我不断在此当前代码上找回对象引用错误
private static HtmlHelper _helper;
public UserHelper(HtmlHelper helper)
{
_helper = helper;
}
public static IIdentity GetUserId()
{
var userIdentity = _helper.ViewContext.HttpContext.User.Identity;
return userIdentity;
}
我进行了搜索,大多数解决方案仅在控制器中起作用,或者根本不起作用。我该如何在课堂上使用它?
答案 0 :(得分:0)
您在此处尝试执行的操作没有任何意义。首先,您不能注入HtmlHelper
,其次,您不能依赖静态方法的注入值。静态方法是在类而非实例上调用的,而您尝试使用的ivar仅在实例化的类实例上可用。
扩展可能会更好。例如,您可以执行以下操作:
public static class HtmlHelperExtensions
{
public static IIdentity GetUserId(this HtmlHelper helper)
{
var userIdentity = helper.ViewContext.HttpContext.User.Identity;
return userIdentity;
}
}
然后:
@Html.GetUserId()
或者,您想将IHttpContextAccessor
注入到UserHelper
中,实际上是注入 UserHelper
以获取实例,然后将其设为非静态GetUserId
方法:
public class UserHelper
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserHelper(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public IIdentity GetUserId()
{
var userIdentity = _httpContextAccessor.HttpContext?.User.Identity;
return userIdentity;
}
}
然后,在您应用的ConfigureServices
中:
services.AddHttpContextAccessor();
services.AddSingleton<UserHelper>();
在类似控制器类的地方,您将像其他任何东西一样注入UserHelper
。在视图中,您可以使用:
@inject Namespace.To.UserHelper UserHelper