Ich weiß, dass meine Antwort ein wenig zu spät ist (fast vier Jahre), um das Spiel, aber ich kam in dieser Frage und ich wollte eine Lösung teilen, die ich mir ausgedacht habe und die mir erlaubt, ziemlich genau das zu tun, was die ursprüngliche Frage machen wollte, falls es jemand anderem in der Zukunft hilft.
Die Lösung beinhaltet ein kleines Juwel namens AttributeUsage
, mit dem wir ein Attribut auf dem Controller (und sogar jedem Basiscontroller!) Angeben und dann bei einzelnen Aktionen oder Subcontrollern nach Bedarf überschreiben (ignorieren/entfernen) können. Sie "kaskadieren" bis zu dem Punkt, an dem nur das granularste Attribut tatsächlich ausgelöst wird: d. H., Sie gehen von den am wenigsten spezifischen (Basis-Controllern) zu spezifischeren (abgeleiteten Controllern) zu den meisten spezifischen (Aktionsmethoden).
Hier ist, wie:
[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
}
(ich Sie wie Attribute gehört, so habe ich einige Attribute auf das Attribut, das ist wirklich, was die magische Arbeit hier an der Spitze macht: Erlauben sie/Kaskade zu erben, aber nur einer von ihnen erlaubt auszuführen)
Hier ist, wie es jetzt verwendet wird.
[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...
}
ich hoffe, das kompiliert, ich riss es aus einem ähnlichen Code und habe ein wenig s suche und ersetze es, damit es nicht perfekt ist.
Danke David! Genau was ich vorhatte! –