Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I add a parameter to an action filter in asp.net?

I have the following filter attribute, and i can pass an array of strings to the attribute like this [MyAttribute("string1", "string2")].

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)         {         }     } } 

How do i pass the string array _ids to the implementation of the action filter? Am i missing something really obvious!?

like image 932
Jorje Redemption Avatar asked Aug 27 '16 12:08

Jorje Redemption


People also ask

What is the difference between action filter and result filter?

Action filters contain logic that is executed before and after a controller action executes. You can use an action filter, for instance, to modify the view data that a controller action returns. Result filters contain logic that is executed before and after a view result is executed.

How do I create a custom filter in .NET core?

You can create custom filter attributes by implementing an appropriate filter interface for which you want to create a custom filter and derive the FilterAttribute class to use that class as an attribute. For example, implement IExceptionFilter and the FilterAttribute class to create a custom exception filter.

How do I get an action filter model?

In case your controller action has multiple arguments and in your filter you want to select the one that is bound via [FromBody] , then you can use reflection to do the following: public void OnActionExecuting(ActionExecutingContext context) { foreach (ControllerParameterDescriptor param in context. ActionDescriptor.


1 Answers

The TypeFilterAttribute has an Argument property (of type object[]) where you can pass arguments to the constructor of the implementation. So applied to your example you can use this code:

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)         {         }     } } 
like image 99
Ralf Bönning Avatar answered Sep 29 '22 19:09

Ralf Bönning