È possibile applicare un ActionFilter in ASP.NET-MVC su OGNI azione
-
19-08-2019 - |
Domanda
Voglio applicare un ActionFilter in ASP.NET MVC a OGNI azione che ho nella mia applicazione - su ogni controller.
C'è un modo per farlo senza applicarlo a ogni singolo metodo ActionResult?
Soluzione
Sì, puoi farlo ma non è il modo in cui funziona immediatamente. Ho fatto quanto segue:
- Crea una classe controller di base e fai in modo che tutti i controller ereditino da essa
- Crea un attributo del filtro azioni e fallo ereditare da FilterAttribute e IActionFilter
- Decorare la classe del controller di base con il nuovo attributo del filtro azioni
Ecco un esempio dell'attributo del filtro azioni:
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
}
Ecco un esempio della classe controller di base con questo attributo:
[SetCulture]
public class ControllerBase : Controller
{
...
}
Utilizzando questo metodo fintanto che le classi del controller ereditano da ControllerBase, il filtro di azione SetCulture verrà sempre eseguito. Ho un campione completo e post su questo sul mio blog se desideri maggiori dettagli.
Spero che ti aiuti!
Altri suggerimenti
Come vanno le cose ... 2 anni dopo abbiamo
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorElmahAttribute());
}
Non devi applicarlo a tutte le azioni, puoi semplicemente applicarlo a tutti i controller (es. metti l'attributo sulla classe, non il metodo).
Oppure, come menzionato da Ian, puoi inserirlo in una classe di controller di base e quindi estenderlo da quel controller.