【问题标题】:Asp.Net core ActionFilter - how to pass varying number of parametersAsp.Net core ActionFilter - 如何传递不同数量的参数
【发布时间】:2018-09-03 22:20:49
【问题描述】:

我想将不同数量的参数传递给 ActionFilter。示例:

[TypeFilter(typeof(AuthorizeFilter), Arguments = new object[] {PolicyName.CanUpdateModule, PolicyName.CanReadModule })]
public async Task<IActionResult> PutModule([FromRoute] Guid id, [FromBody] Module module)

我定义了如下过滤器,但出现错误 “InvalidOperationException:找不到适合类型'MyApp.AuthFilters.AuthorizeFilter'的构造函数。确保类型是具体的,并且为公共构造函数的所有参数注册了服务。”。我该如何解决这个问题?

public class AuthorizeFilter : ActionFilterAttribute
{
    private readonly IAuthorizationService _authService;
    private readonly string[] _policyNames;

    public AuthorizeFilter(IAuthorizationService authService,params string[] policyNames)
    {
        _authService = authService;
        _policyNames = policyNames.Select(f => f.ToString()).ToArray();
    }...
}

【问题讨论】:

  • 如果您在构造函数中指定参数,例如public AuthorizeFilter(IAuthorizationService authService, string canUpdate, string canRead),它是否有效
  • 是的,如果单独声明,它确实有效。

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


【解决方案1】:

关闭但没有雪茄。您正在使用错误的参数调用您的过滤器。您已经将其称为TypeFilterAttribute,因为您需要传入 DI 参数。

现在你只需要修正你的论点。你想传入一个字符串数组,但是你传入了几个字符串。

[TypeFilter(typeof(AuthorizeFilter), 
    Arguments = new object[] {
        new string[] { PolicyName.CanUpdateModule,  PolicyName.CanReadModule }
    }
)]
public async Task<IActionResult> PutModule([FromRoute] Guid id, [FromBody] Module module) {
    /*do stuff*/
}

尽管如此,您的IAuthorizationService 仍然需要在您的 DI 容器中注册,才能解决。

然后你需要从你的AuthorizeFilter 类中删除你的params 关键字:

public class AuthorizeFilter : ActionFilterAttribute
{
    private readonly IAuthorizationService _authService;
    private readonly string[] _policyNames;

    public AuthorizeFilter(IAuthorizationService authService,string[] policyNames)
    {
        _authService = authService;
        _policyNames = policyNames;
    }
    /* ... */
}

【讨论】:

  • 太棒了!这解决了问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多