【问题标题】:ASP.NET Core 2.1 How to call filter that refers to a classASP.NET Core 2.1 如何调用引用类的过滤器
【发布时间】:2018-10-17 13:42:00
【问题描述】:

我有一个要从函数调用的操作过滤器。但是,在此过滤器中,我指的是另一个名为 ValidateRoleClient 的类。如何进行服务注入?或者在我的函数中正确调用这个类?

public class RolesFilterAttribute : ActionFilterAttribute
{
    public ValidateRoleClient validateRoleClient;
    public string Role { get; set; }

    public RolesFilterAttribute(ValidateRoleClient validateRoleClient)
    {
        this.validateRoleClient = validateRoleClient;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.HttpContext.Request.Cookies["Token"] != null || context.HttpContext.Request.Cookies["RefreshToken"] != null)
        {
            TokenViewModel tvm = new TokenViewModel
            {
                Token = context.HttpContext.Request.Cookies["Token"],
                RefreshToken = context.HttpContext.Request.Cookies["RefreshToken"]
            };
            ValidateRoleViewModel vrvm = new ValidateRoleViewModel
            {
                Role = Role,
                Token = tvm
            };
            validateRoleClient.ValidateRole(vrvm);
        }
    }
}

这就是我在函数中引用过滤器的方式

[RolesFilter]
public IActionResult About()
{
    return View();
}

我从中得到的当前错误是

严重性代码描述项目文件行抑制 状态错误 CS7036 没有给出对应于的参数 所需的形式参数“validateRoleClient” 'RolesFilterAttribute.RolesFilterAttribute(ValidateRoleClient)'

【问题讨论】:

  • 为此实现自己的过滤器工厂可能有点多 - docs 中有更简单的选项,例如TypeFilterAttribute.

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

您可以像这样将属性包装在 FilterFactory 中:

public class RolesFilterAttribute : Attribute, IFilterFactory
{
    public string Role { get; set; }       

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        return new RolesFilterAttributeImplementation(
            serviceProvider.GetRequiredService<ValidateRoleClient>(),
            Role
        );
    }

    private class RolesFilterAttributeImplementation : ActionFilterAttribute
    {
        private readonly ValidateRoleClient validateRoleClient;
        private readonly string role;

        public RolesFilterAttributeImplementation(ValidateRoleClient validateRoleClient, string role)
        {
            this.validateRoleClient = validateRoleClient;
            this.role = role;
        }

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.HttpContext.Request.Cookies["Token"] != null || context.HttpContext.Request.Cookies["RefreshToken"] != null)
            {
                TokenViewModel tvm = new TokenViewModel
                {
                    Token = context.HttpContext.Request.Cookies["Token"],
                    RefreshToken = context.HttpContext.Request.Cookies["RefreshToken"]
                };
                ValidateRoleViewModel vrvm = new ValidateRoleViewModel
                {
                    Role = role,
                    Token = tvm
                };
                validateRoleClient.ValidateRole(vrvm);
            }
        }
    }

    public bool IsReusable => false;
}

当然ValidateRoleClient服务必须先配置为注入。

然后您可以像往常一样使用RolesFilterAttribute 属性。

您可以在此处阅读有关IFilterFactory 的更多信息:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.1#ifilterfactory

【讨论】:

  • 您好!谢谢回答。 IsReusable 有什么用途?
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 2019-02-22
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多