2012-07-18 5 views
6

Dado el nombre de la acción, el nombre del controlador y el verbo HTTP (GET, POST .. etc), es posible verificar si la acción tiene (es decir, está decorada) una acción específica atributo de filtro?Cómo obtener ActionDescriptor usando nombres de acción y controlador

Tenga en cuenta: La acción y el controlador no son la acción y el controlador actuales, pero pueden ser cualquier acción y controlador en la aplicación.

Gracias!

Respuesta

0

No estoy muy seguro de que entienda en qué lugar desea verificarlo. Si lo está haciendo en OnActionExecuting o OnActionExecuted. ActionExecutedContext tiene la propiedad ActionDescriptor. Allí puede encontrar el método IsDefined que tiene la posibilidad de verificar si una o más instancias del tipo de atributo especificado están definidas para este miembro. Compruebe abajo ejemplo de código:

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

EDIT: OK, ahora consigo su problema. Parece que no hay una solución elegante. Si necesita jugar en el método AjaxExtensions.BeginForm con la verificación de otras acciones, solo veo una forma: Reflexión. Pero en mi opinión, necesitas replantear tu arquitectura en este caso.

+0

Gracias por su respuesta, pero como he mencionado en mi pregunta, no estoy tratando de comprobar la ActionDescriptor de la acción que se está ejecutando. Comprobaré un método de extensión AjaxHelper, específicamente una sobrecarga adicional de Ajax.BeginForm(), y quiero poder verificar si el nombre de acción especificado en BeginForm() tiene un atributo específico. – dev99

+0

Verifique mi respuesta de edición. – RredCat

4

He respondido mi propia pregunta, que es muy similar a esto.

También necesitará el http method (es GET, POST) para obtener el resultado correcto, además de los nombres de acción y el controlador.

Esta es la parte del código que resuelve su 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

tuve un problema similar en el que necesitaba para comprobar si una acción tuvo un atributo personalizado.

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); 
    } 

crédito a this SO answer

Cuestiones relacionadas