Можете ли вы применить ActionFilter в ASP.NET-MVC для КАЖДОГО действия

StackOverflow https://stackoverflow.com/questions/649409

  •  19-08-2019
  •  | 
  •  

Вопрос

Я хочу применить ActionFilter в ASP.NET MVC для КАЖДОГО действия в моем приложении - на каждом контроллере.

Есть ли способ сделать это, не применяя его к каждому методу ActionResult?

Это было полезно?

Решение

Да, вы можете сделать это, но это не так, как это работает из коробки. Я сделал следующее:

<Ол>
  • Создайте базовый класс контроллеров и сделайте так, чтобы все ваши контроллеры наследовали его
  • Создайте атрибут фильтра действий и сделайте его наследником от FilterAttribute и IActionFilter
  • Украсьте свой базовый класс контроллера новым атрибутом фильтра действий
  • Вот пример атрибута фильтра действий:

    public class SetCultureAttribute : FilterAttribute, IActionFilter 
    { 
        #region IActionFilter implementation
    
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //logic goes here
        }
    
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //or logic goes here
        }
    
        #endregion IActionFilter implementation
    }
    

    Вот пример базового класса контроллера с этим атрибутом:

    [SetCulture]
    public class ControllerBase : Controller
    {
        ...
    }
    

    Используя этот метод, если ваши классы контроллеров наследуются от ControllerBase, фильтр действий SetCulture всегда будет выполняться. У меня есть полный образец и сообщение на этот в моем блоге , если хотите немного подробнее.

    Надеюсь, это поможет!

    Другие советы

    Как все становится лучше ... 2 года спустя у нас есть

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorElmahAttribute());
        }
    

    Вам не нужно применять его к каждому действию, вы можете просто применить его к каждому контроллеру (т. е. поместить атрибут в класс, а не в метод).

    Или, как упомянул Ян, вы можете поместить его в базовый класс контроллера, а затем расширять его с этого контроллера.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top