2009-08-31 14 views
8

Estoy tratando de enumerar todos los controladores y sus acciones con atributos específicos para crear un mapa de sitio de google dinámico. Para que pueda "marcar" ciertas acciones con un atributo para que aparezcan en el mapa del sitio.Asp.net Mvc: enumere todas las acciones en un controlador con el atributo específico

Here Descubrí cómo obtener todos los controladores. Pero no estoy seguro de cómo obtener todas sus Acciones con un atributo particular. Probé GetMethods y luego uso GetCustomAttributes, pero no estoy seguro de si esa es la manera correcta de hacerlo. Se sintió un poco complicado.

Una vez que obtengo los controladores y sus acciones, voy a utilizar la técnica explicada here para obtener las direcciones URL. Como puede ver, Eric Duncan habla sobre lo que estoy tratando de lograr en esa pregunta.

Gracias de antemano.

Respuesta

17

Utilizo algún código en mis pruebas de unidad para verificar que ciertas acciones estén decoradas con atributos. Utiliza la reflexión con alguna bondad de método de extensión enumerable. Creo que podrías adaptar esto. Tenga en cuenta que, si solo le importa si existe o no, puede usar Count() en la enumeración en lugar de obtener el atributo real. De esta forma, le permite cierta flexibilidad al usar las propiedades de los atributos para personalizar el comportamiento. Usar el árbol de herencia te permitirá decorar un controlador completo.

var methods= controller.GetType() 
         .GetMethods(BindingFlags.Public | BindingFlags.Instance) 
foreach (var info in methods) 
{ 
    if (info.ReturnType == typeof(ActionResult)) 
    { 
     var attribute = info.GetCustomAttributes(typeof(SiteMapAttribute), true) 
          .Cast<SiteMapAttribute>() 
          .FirstOrDefault(); 

     if (attribute != null && !attribute.Exclude.Contains(info.Name)) 
     { 
      ... 
     } 
    } 
} 
Cuestiones relacionadas