2009-07-03 8 views
1

Ich habe einen BaseController, der über ein Attribut verfügt und nicht über einzelne Aktionen, daher laufen alle Controller durch. Ich habe eine Aktion auf einem Controller, auf dem der Attributcode nicht ausgeführt werden soll. Wie kann ich das umsetzen?Kann ich ein Controller ActionAttribute überschreiben?

[MyAttribute] 
public class BaseController : Controller 
{ 

} 

public class WebPageController : BaseController 
    { 
     //How to override attribute executing here? 
     public ActionResult Index() 
     { 
      //do stuff 
     } 

    } 

public class PagePermissionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //Do stuff 
    } 
} 

Antwort

4

Ich habe die Frage völlig missverstanden, also habe ich meine vorherige Antwort entfernt, die auf Handlungsvererbung ausgerichtet war.

Um einen Filter bei einer Aktion in einem abgeleiteten Controller auslassen zu müssen, denke ich, dass ich anders damit umgehen würde. Eine Idee wäre, Ihren Filter zu haben - wenn Sie einen eingebauten Filter verwenden, müssen Sie daraus einen benutzerdefinierten Filter ableiten - benutzen Sie reflection, um vor der Ausführung zu prüfen, ob ein anderes Attribut vorhanden ist. Wenn das Attribut verfügbar ist, wird es einfach nicht ausgeführt.

public class SkipAuthorizeAttribute : Attribute 
{ 
    public string RouteParameters { get; set; } 
} 

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var action = filterContext.RouteData["action"]; 
     var methods = filterContext.Controller 
            .GetType() 
            .GetMethods() 
            .Where(m => m.Name == action); 
     var skips = methods.GetCustomAttributes(typeof(SkipAuthorizeAttribute),false) 
          .Cast<SkipAuthorizeAttribute>(); 

     foreach (var skip in skips) 
     { 
      ..check if the route parameters match those in the route data... 
      if match then return 
     } 

     base.OnAuthorization(); 
    } 
} 

Verbrauch:

[CustomAuthorize] 
public class BaseController : Controller 
{ 
    ... 
} 

public class DerivedController : BaseController 
{ 
    // this one does get the base OnAuthorization applied 
    public ActionResult MyAction() 
    { 
     ... 
    } 

    // this one skips the base OnAuthorization because the parameters match 
    [SkipAuthorize(RouteParameters="id,page")] 
    public ActionResult MyAction(int id, int page) 
    { 
     ... 
    } 
} 
+0

ich das falsch verstanden vollständig Ihre Frage. Ich habe mit einer Lösung aktualisiert, die die eigentliche Frage behandelt. Viel komplizierter. – tvanfosson

Verwandte Themen