sé que mi respuesta es un poco tarde (casi cuatro años) para el juego, pero me encontré con esta pregunta y quería compartir una solución que ideé que me permite hacer más o menos lo que la pregunta original quería hacer, en caso de que ayude a alguien más en el futuro.
La solución consiste en una pequeña gema llamada AttributeUsage
, que nos permite especificar un atributo en el controlador (¡e incluso cualquier controlador base!) Y luego anular (ignorar/eliminar) en acciones individuales o subcontroladores según sea necesario. Se "conectarán en cascada" hasta donde solo se dispara el atributo más granular: es decir, pasan de ser menos específicos (controladores de base) a más específicos (controladores derivados), a los más específicos (métodos de acción).
Así es como:
[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
}
(he oído como atributos, por lo que poner algunos atributos en el atributo Eso es realmente lo que hace que el trabajo de magia aquí en lo más alto:! Lo que les permite heredar/cascada, pero sólo uno de ellos lo que permite ejecutar)
Así es como se usa ahora:.
[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...
}
espero que esto compila, di un tirón desde algún código similar y hice un poco de s earch-and-replace en él así que puede no ser perfecto.
Gracias David! ¡Exactamente lo que tenía en mente! –