So che la mia risposta è un po 'tardi (quasi quattro anni) per il gioco, ma mi sono imbattuto in questa domanda e volevo condividere una soluzione che ho ideato che mi permettesse di fare più o meno quello che la domanda originale voleva fare, nel caso in cui aiutasse qualcun altro in futuro.
La soluzione comprende un piccolo gioiello chiamato AttributeUsage
, che ci consente di specificare un attributo sul controller (e anche su qualsiasi controller di base! Essi "si sovrappongono" fino a dove viene attivato solo l'attributo più granulare: cioè, passano da meno specifici (controllori di base) a più specifici (controllori derivati), a più specifici (metodi di azione).
Ecco come:
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method, Inherited=true, AllowMultiple=false)]
public class MyCustomFilterAttribute : ActionFilterAttribute
{
private MyCustomFilterMode _Mode = MyCustomFilterMode.Respect; // this is the default, so don't always have to specify
public MyCustomFilterAttribute()
{
}
public MyCustomFilterAttribute(MyCustomFilterMode mode)
{
_Mode = mode;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (_Mode == MyCustomFilterMode.Ignore)
{
return;
}
// Otherwise, respect the attribute and work your magic here!
//
//
//
}
}
public enum MyCustomFilterMode
{
Ignore = 0,
Respect = 1
}
(ti ho sentito come attributi, così ho messo alcuni attributi per l'attributo Questo è davvero ciò che rende il lavoro magia qui in cima: permettendo loro di ereditare/a cascata, ma consentendo solo uno di loro da eseguire)
Ecco come viene utilizzato oggi:.
[MyCustomFilter]
public class MyBaseController : Controller
{
// I am the application's base controller with the filter,
// so any derived controllers will ALSO get the filter (unless they override/Ignore)
}
public class HomeController : MyBaseController
{
// Since I derive from MyBaseController,
// all of my action methods will also get the filter,
// unless they specify otherwise!
public ActionResult FilteredAction1...
public ActionResult FilteredAction2...
[MyCustomFilter(Ignore)]
public ActionResult MyIgnoredAction... // I am ignoring the filter!
}
[MyCustomFilter(Ignore)]
public class SomeSpecialCaseController : MyBaseController
{
// Even though I also derive from MyBaseController, I can choose
// to "opt out" and indicate for everything to be ignored
public ActionResult IgnoredAction1...
public ActionResult IgnoredAction2...
// Whoops! I guess I do need the filter on just one little method here:
[MyCustomFilter]
public ActionResult FilteredAction1...
}
Spero che questo compila, mi strappai da qualche codice simile e ha fatto un po 'di s earch-and-replace su di esso in modo che potrebbe non essere perfetto.
Grazie David! Esattamente quello che avevo in mente! –