2009-08-31 4 views
8

J'essaye de lister tous les contrôleurs et leurs actions avec des attributs spécifiques pour créer un sitemap google dynamique. Pour que je puisse "marquer" certaines actions avec un attribut afin qu'elles apparaissent dans le sitemap.Asp.net Mvc: Liste toutes les actions sur un contrôleur avec l'attribut spécifique

Here J'ai découvert comment obtenir tous les contrôleurs. Mais je ne suis pas sûr de savoir comment obtenir toutes leurs actions avec un attribut particulier. J'ai essayé GetMethods, puis j'utilise GetCustomAttributes mais je ne suis pas sûr que ce soit la bonne façon de le faire. C'était un peu trop compliqué.

Une fois que j'aurais les contrôleurs et leurs actions j'allais utiliser la technique expliquée here pour obtenir les urls. Comme vous pouvez le remarquer, Eric Duncan parle de ce que j'essaie d'accomplir dans cette question.

Merci d'avance.

Répondre

17

J'utilise du code dans mes tests unitaires pour vérifier que certaines actions sont décorées avec des attributs. Il utilise la réflexion avec un certain nombre de méthodes de vulgarisation. Je pense que vous pourriez adapter cela. Notez que si vous vous souciez uniquement de savoir si elle existe ou non, vous pouvez utiliser Count() sur l'énumération plutôt que d'obtenir l'attribut réel. Cela vous permet une certaine flexibilité dans l'utilisation des propriétés d'attribut pour personnaliser le comportement. L'utilisation de l'arbre d'héritage vous permettrait de décorer un contrôleur entier.

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)) 
     { 
      ... 
     } 
    } 
} 
Questions connexes