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?

¿Fue útil?

Solución

Sí, puede hacer esto, pero no es la forma en que funciona fuera de la caja. Hice lo siguiente:

  1. Cree una clase de controlador base y haga que todos sus controladores hereden de ella
  2. Cree un atributo de filtro de acción y haga que herede de FilterAttribute e IActionFilter
  3. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top