Как добавить параметр в фильтр действий в asp.net?

У меня есть следующий атрибут фильтра, и я могу передать массив строк в атрибут, подобный этому [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)
        {
        }
    }
}

Как передать массив строк _ids в реализацию фильтра действий? Я пропустил что-то действительно очевидное!?


person Jorje Redemption    schedule 27.08.2016    source источник
comment
Из-за «TypeFilterAttribute» вы используете ASP.NET Core?   -  person Ralf Bönning    schedule 27.08.2016
comment
Да, я - это вызывает проблемы?   -  person Jorje Redemption    schedule 27.08.2016
comment
Я видел примеры в старом ASP.NET для достижения того, что мне нужно, но в ядре я не вижу примеров, которые реализуют класс TypeFilterAttribute и передают параметры.   -  person Jorje Redemption    schedule 27.08.2016
comment
Добавлен asp.net-core в теги...   -  person Jorje Redemption    schedule 27.08.2016


Ответы (1)


TypeFilterAttribute имеет свойство Argument (типа object[]), где вы можете передавать аргументы конструктору реализации. Итак, применительно к вашему примеру вы можете использовать этот код:

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)
        {
        }
    }
}
person Ralf Bönning    schedule 27.08.2016
comment
Это похоже на сон! Я попробую... спасибо! - person Jorje Redemption; 27.08.2016
comment
Как я могу передать в нем экземпляр IConfiguration? - person Himalaya Garg; 22.10.2018
comment
это сообщение по теме stackoverflow.com/a/39258157/125981 - person Mark Schultheiss; 27.02.2020
comment
Здравствуйте, как я могу зарегистрировать это на startup.cs? - person OrElse; 14.05.2020
comment
@orElse Я не думаю, что тебе нужно. Мой работает без регистрации в автозагрузке. - person perustaja; 08.01.2021