Jorje Redemption Jorje Redemption - 3 months ago 13
C# Question

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

Answer

The TypedFilterAttribute has got a 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)
        {
        }
    }
}
Comments