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?

È stato utile?

Soluzione

Sì, puoi farlo ma non è il modo in cui funziona immediatamente. Ho fatto quanto segue:

  1. Crea una classe controller di base e fai in modo che tutti i controller ereditino da essa
  2. Crea un attributo del filtro azioni e fallo ereditare da FilterAttribute e IActionFilter
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top