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

1

35

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!?

Heelandtoe answered 27/8, 2016 at 12:55 Comment(4)
Because of the ´TypeFilterAttribute´ - are you using ASP.NET Core ?Lording
Yes, I am - does this cause issues?Heelandtoe
I have seen examples in old ASP.NET to achieve what i need, but in core, i cant seem to seen any examples that implement TypeFilterAttribute class and pass parameters.Heelandtoe
Added asp.net-core to tags...Heelandtoe
G
89

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)
        {
        }
    }
}
Gustafson answered 27/8, 2016 at 13:21 Comment(5)
This looks like the dream! I will give it a go... thanks!Heelandtoe
How can I pass 'IConfiguration' instance in it?Superhighway
this is a subject related post https://mcmap.net/q/271355/-how-to-use-action-filters-with-dependency-injection-in-asp-net-coreEvangelina
Hello, how can i register this on startup.cs ?Mumford
@orElse I don't believe you have to. Mine works without any registration in startup.Carve

© 2022 - 2024 — McMap. All rights reserved.