¿Se puede aplicar un ActionFilter en ASP.NET-MVC en CADA acción?
-
19-08-2019 - |
Pregunta
Quiero aplicar un ActionFilter en ASP.NET MVC para CADA acción que tengo en mi aplicación, en cada controlador.
¿Hay alguna manera de hacer esto sin aplicarlo a todos los métodos ActionResult?
Solución
Sí, puede hacer esto, pero no es la forma en que funciona fuera de la caja. Hice lo siguiente:
- Cree una clase de controlador base y haga que todos sus controladores hereden de ella
- Cree un atributo de filtro de acción y haga que herede de FilterAttribute e IActionFilter
- Decora tu clase de controlador base con tu nuevo atributo de filtro de acción
Aquí hay una muestra del atributo de filtro de acción:
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
}
Aquí hay una muestra de la clase de controlador base con este atributo:
[SetCulture]
public class ControllerBase : Controller
{
...
}
Usando este método siempre que sus clases de controlador hereden de ControllerBase, el filtro de acción SetCulture siempre se ejecutará. Tengo una muestra completa y publico en este en mi blog si desea un poco más de detalle.
¡Espero que eso ayude!
Otros consejos
Cómo mejoran las cosas ... 2 años después tenemos
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorElmahAttribute());
}
No tiene que aplicarlo a cada acción, simplemente puede aplicarlo a cada controlador (es decir, poner el atributo en la clase, no en el método).
O, como mencionó Ian, puede colocarlo en una clase de controlador base y luego extenderlo desde ese controlador.