web-dev-qa-db-fra.com

Comment ajouter un paramètre à un filtre d'action dans asp.net?

J'ai l'attribut de filtre suivant, et je peux passer un tableau de chaînes à l'attribut comme ceci [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)
        {
        }
    }
}

Comment passer le tableau de chaînes _ids à la mise en place du filtre d'action? Suis-je en train de manquer quelque chose de vraiment évident?!

21
Jorje Redemption

TypedFilterAttribute a une propriété Argument (de type object[]) où vous pouvez passer des arguments au constructeur de l'implémentation. Donc, appliqué à votre exemple, vous pouvez utiliser ce 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)
        {
        }
    }
}
39
Ralf Bönning