10

私は以下のフィルタ属性を持っており、このような属性に文字列の配列を渡すことができます[MyAttribute("string1", "string2")]asp.netのアクションフィルターにパラメーターを追加するにはどうすればよいですか?

public class MyAttribute : TypeFilterAttribute 
{ 
    private readonly string[] _ids; 

    public MyAttribute(params string[] ids) : base(typeof(MyAttributeImpl)) 
    { 
     _ids = ids; 
    } 

    private class MyAttributeImpl : IActionFilter 
    { 
     private readonly ILogger _logger; 

     public MyAttributeImpl(ILoggerFactory loggerFactory) 
     { 
      _logger = loggerFactory.CreateLogger<MyAttribute>(); 
     } 

     public void OnActionExecuting(ActionExecutingContext context) 
     { 
      // HOW DO I ACCESS THE IDs VARIABLE HERE ??? 
     } 

     public void OnActionExecuted(ActionExecutedContext context) 
     { 
     } 
    } 
} 

文字列配列_idsをアクションフィルタの実装に渡すにはどうすればよいですか?本当に明白な何かが欠けているのですか?

+0

のため、 'TypeFilterAttribute' - ASP.NETコアを使用していますか? –

+0

はい、私は - これは問題の原因ですか? –

+0

私は必要なものを実現するために古いASP.NETで例を見ましたが、コアでは、TypeFilterAttributeクラスを実装してパラメータを渡す例は見当たりません。 –

答えて

23

TypedFilterAttributeには、実装のコンストラクタに引数を渡すことができるのプロパティ(タイプはobject[])があります。あなたの例に適用されるので、このコードを使用することができます:

public class MyAttribute : TypeFilterAttribute 
{   
    public MyAttribute(params string[] ids) : base(typeof(MyAttributeImpl)) 
    { 
     Arguments = new object[] { ids }; 
    } 

    private class MyAttributeImpl : IActionFilter 
    { 
     private readonly string[] _ids; 
     private readonly ILogger _logger; 

     public MyAttributeImpl(ILoggerFactory loggerFactory, string[] ids) 
     { 
      _ids = ids; 
      _logger = loggerFactory.CreateLogger<MyAttribute>(); 
     } 

     public void OnActionExecuting(ActionExecutingContext context) 
     { 
      // NOW YOU CAN ACCESS _ids 
      foreach (var id in _ids) 
      { 
      } 
     } 

     public void OnActionExecuted(ActionExecutedContext context) 
     { 
     } 
    } 
} 
+1

これは夢のように見えます!私はそれを行くつもりです...ありがとう! –

関連する問題