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

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

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


person Simon_Weaver    schedule 16.03.2009    source источник


Ответы (3)


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

  1. Создайте базовый класс контроллера и унаследуйте от него все ваши контроллеры.
  2. Создайте атрибут фильтра действия и унаследуйте его от FilterAttribute и IActionFilter.
  3. Украсьте свой базовый класс контроллера новым атрибутом фильтра действий

Вот образец атрибута фильтра действий:

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. У меня есть полный образец и размещаю на этом в моем блоге, если вы хотите поподробнее.

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

person Ian Suttle    schedule 16.03.2009
comment
Это влияет только на ActionResults? Или это также влияет на другие типы результатов? JsonResult, FileResult и т. Д.? - person JK.; 16.04.2013

Как дела налаживаются ... 2 года спустя у нас

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorElmahAttribute());
    }
person Tony Basallo    schedule 29.04.2011
comment
базалло - откуда бы вы это назвали? или поставить? - person Simon_Weaver; 30.04.2011

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

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

person Richard Szalay    schedule 16.03.2009