2012-07-18 11 views
6

Dato il nome dell'azione, il nome del controller e il verbo HTTP (GET, POST .. ecc.), È possibile verificare se l'azione ha (cioè è decorata da) un'azione specifica attributo filtro?Come ottenere ActionDescriptor usando i nomi di azioni e controller

Nota: l'azione e il controller non sono l'azione corrente e il controller, ma possono essere qualsiasi azione e controller nell'app.

Grazie!

risposta

0

Non sono abbastanza sicuro di capire in quale posto si desidera verificarlo. Se lo fai in OnActionExecuting o OnActionExecuted. ActionExecutedContext ha la proprietà ActionDescriptor. Qui è possibile trovare il metodo IsDefined che ottiene la possibilità di verificare se una o più istanze del tipo di attributo specificato sono definite per questo membro. Controllare di codice sotto:

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    var hasAutorizeAttr = filterContext.ActionDescriptor 
          .IsDefined(typeof(AuthorizeAttribute), false); 
    base.OnActionExecuted(filterContext); 
} 

EDIT: OK, ora ho il problema. Sembra che non ci sia una soluzione elegante. Se hai bisogno di giocare nel metodo AjaxExtensions.BeginForm con il controllo di altre azioni, vedo solo un modo: Reflection. Ma secondo me è necessario ripensare la tua architettura in questo caso.

+0

Grazie per la risposta, ma come ho già detto nella mia interrogazione, non sto cercando di controllare l'ActionDescriptor dell'azione attualmente in esecuzione. Verificherò un metodo di estensione AjaxHelper, in particolare un sovraccarico aggiuntivo di Ajax.BeginForm(), e voglio essere in grado di verificare se il nome dell'azione specificato in BeginForm() ha un attributo specifico. – dev99

+0

Controlla la mia risposta di modifica. – RredCat

4

Ho risposto alla mia domanda, che è molto simile a questo.

Sarà inoltre necessario il http method (cioè GET, POST) per ottenere il risultato corretto, oltre a nomi di azione e di controller.

Questo è il pezzo di codice che risolve il problema:

var controllerFactory = ControllerBuilder.Current 
    .GetControllerFactory(); 

var controllerContext = @this.ControllerContext; 

var otherController = (ControllerBase)controllerFactory 
    .CreateController(
     new RequestContext(controllerContext.HttpContext, new RouteData()), 
     controllerName); 

var controllerDescriptor = new ReflectedControllerDescriptor(
    otherController.GetType()); 

var controllerContext2 = new ControllerContext(
    new MockHttpContextWrapper(
     controllerContext.HttpContext.ApplicationInstance.Context, 
     method), 
    new RouteData(), 
    otherController); 

var actionDescriptor = controllerDescriptor 
    .FindAction(controllerContext2, actionName); 
0

ho avuto un problema simile in cui avevo bisogno di verificare se l'azione ha avuto un attributo personalizzato.

public static IEnumerable<MyCustomAttribute> GetAttributes(string controllerName, string actionName) 
    { 
     var types = Assembly.GetExecutingAssembly().GetTypes(); 
     var controllers = types.Where(t => (t.Name == controllerName)); 
     var action = controllers.SelectMany(type => type.GetMethods().Where(a => a.Name == actionName)).FirstOrDefault(); 
     return action.GetCustomAttributes<MyCustomAttribute>(true); 
    } 

credito a this SO answer

Problemi correlati