Asp.net 如何在_viewimports文件中注入依赖项

Asp.net 如何在_viewimports文件中注入依赖项,asp.net,asp.net-mvc,asp.net-core,asp.net-identity,Asp.net,Asp.net Mvc,Asp.net Core,Asp.net Identity,我正在尝试在asp.net Core中生成一个通用BaseViewPage以访问当前用户的身份 为此,我创建了一个BaseViewPage.cs文件- public abstract class BaseViewPage<TModel> : RazorPage<TModel> { private static ClaimsPrincipal principal; public BaseViewPage(IPrincipal _pr

我正在尝试在asp.net Core中生成一个通用BaseViewPage以访问当前用户的身份

为此,我创建了一个BaseViewPage.cs文件-

 public abstract class BaseViewPage<TModel> : RazorPage<TModel>
    {
        private static ClaimsPrincipal principal;
        public BaseViewPage(IPrincipal _principal)
        {
            principal = _principal as ClaimsPrincipal;
        }
    }
每当我尝试使用视图中的任何属性-
ProductCategories.cshtml
时,就会在此处调用错误

严重性代码说明项目文件行抑制状态 错误CS7036给定的参数中没有与 的必需形式参数“\u principal” 'BaseViewPage.BaseViewPage(IPrincipal)'MyStore D:\Projects\TWCStore\TWCStore\Views\Store\ProductCategories.cshtml 1处于活动状态

我假设当我注入依赖项时,它希望我将
IPrincipal
也作为依赖项放在这里-

 @inherits MyStore.Helpers.BaseViewPage<TModel>
@继承MyStore.Helpers.BaseViewPage

如何在这里注入这种依赖关系?

我在这里为这个问题编写解决方案(实际上是一个替代方案)已经很晚了

所以我遵循依赖注入(很抱歉现在忘记了帮助链接)

这就是我所做的-

创建一个界面

public interface IAppUserAccessor
    {
        int MemberId { get; }
    }
解析器类

 public class AppUserAccessor : IAppUserAccessor
    {
        private readonly MyContext _context;
        public AppUserAccessor(MyContext context)
        {
            _context = context;
        }

        int IAppUserAccessor.MemberId
        {
            get
            {
                return _context.Member.MemberId;
            }
        }
    }
在StartUp.cs中的“配置服务”部分注册服务

 services.AddTransient<IAppUserAccessor, AppUserAccessor>();
现在,在每个视图中都可以访问它,因为-

@AppUserAccessor.MemberId

我在这里写这个问题的解决方案(实际上是一个替代方案)已经很晚了

所以我遵循依赖注入(很抱歉现在忘记了帮助链接)

这就是我所做的-

创建一个界面

public interface IAppUserAccessor
    {
        int MemberId { get; }
    }
解析器类

 public class AppUserAccessor : IAppUserAccessor
    {
        private readonly MyContext _context;
        public AppUserAccessor(MyContext context)
        {
            _context = context;
        }

        int IAppUserAccessor.MemberId
        {
            get
            {
                return _context.Member.MemberId;
            }
        }
    }
在StartUp.cs中的“配置服务”部分注册服务

 services.AddTransient<IAppUserAccessor, AppUserAccessor>();
现在,在每个视图中都可以访问它,因为-

@AppUserAccessor.MemberId

您尝试过在startup.cs中注册吗?ClaimsPrincipal不是通过依赖项注入注册的,身份验证中间件会根据每个请求的身份验证cookie创建主体。您不需要注入它,因为它已经在视图中可用。用户属性在视图中本质上是可用的,并且是最重要的,因此最好不要创建具有构造函数依赖项的basepage。您不需要这样做,因为您可以在视图内部使用@inject来获取注入的内容。\u viewimports只是为了使名称空间和标记帮助程序在其他视图中全局可用,仅此而已,你不应该尝试做其他事情there@JoeAudette,在所有情况下,如果不注入ClaimsPrincipal,我都会得到null。让我知道你如何在不注射的情况下获得索赔?另外,我的问题通过注入接口而不是继承来解决。我应该在空闲时间更新这个问题。您是否尝试过在startup.cs中注册?ClaimsPrincipal不是使用依赖项注入注册的,身份验证中间件会根据每个请求的身份验证cookie创建主体。您不需要注入它,因为它已经在视图中可用。用户属性在视图中本质上是可用的,并且是最重要的,因此最好不要创建具有构造函数依赖项的basepage。您不需要这样做,因为您可以在视图内部使用@inject来获取注入的内容。\u viewimports只是为了使名称空间和标记帮助程序在其他视图中全局可用,仅此而已,你不应该尝试做其他事情there@JoeAudette,在所有情况下,如果不注入ClaimsPrincipal,我都会得到null。让我知道你如何在不注射的情况下获得索赔?另外,我的问题通过注入接口而不是继承来解决。我应该在业余时间更新这个问题。