尝试构建核心2.2 User Helper

时间:2019-07-08 01:55:35

标签: c# asp.net-core

我正在尝试为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;
    }

我进行了搜索,大多数解决方案仅在控制器中起作用,或者根本不起作用。我该如何在课堂上使用它?

1 个答案:

答案 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