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!?
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.
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.
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.
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) { } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With