2016-05-17 1 views
0

J'ai réussi à obtenir une liste de tous les contrôleurs et de leurs actions respectives dans mon projet. Je tente maintenant de créer un attribut personnalisé à utiliser sur chaque action où je peux définir des propriétés telles que la description de l'action par exemple. "Cela crée un utilisateur". Cela semble fonctionner correctement mais maintenant la question est: Comment puis-je récupérer les attributs personnalisés sur chaque action?Comment obtenir tous les attributs personnalisés pour chaque action du contrôleur dans le projet

Vous trouverez ci-dessous une liste de tous les contrôleurs et actions. J'ai juste besoin d'obtenir chaque action attribut personnalisé appelé AccessControl

  var controlleractionlist = asm.GetTypes() 
       .Where(type => typeof(System.Web.Mvc.Controller).IsAssignableFrom(type)) 
       .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public)) 
       .Where(m => !m.GetCustomAttributes(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), true).Any()) 
       .Select(x => new { Controller = x.DeclaringType.Name, Action = x.Name, CustomAttr = x.DeclaringType.GetCustomAttributes(typeof(AccessControl), false).Cast<AccessControl>()}) 
       .OrderBy(x => x.Controller).ThenBy(x => x.Action).ToList(); 

Exemple d'une action de contrôleur typique

[HttpGet] 
    [AccessControl(Description="Creates a user")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

Et enfin mon habitude attribut de classe

public class AccessControl : AuthorizeAttribute 
{ 
    public string Description { get; set; } 
} 

Merci

Répondre

0

Utilisez ceci:

Expression<Action<YourController>> myAction = m => m.Index(); 
var method = ((MethodCallExpression)myAction.Body).Method; 
var statusAttributes = method.GetCustomAttributes(); 

Vous pouvez obtenir tous les attributs de costume de la collection StatusAttributes ci-dessus.

+0

Si vous souhaitez accéder à plus d'attributs hérités de parent, transmettez true en tant que paramètre dans GetCustomAttributes(). –

+0

Je n'exécute pas cette fonctionnalité dans le contrôleur lui-même. Il se produit dans un contrôleur différent où j'obtiens une liste de tous les contrôleurs accèdent au système avec leurs actions. Maintenant, pour chaque action, j'aimerais accéder aux attributs personnalisés. – Rossco

+0

Que ce soit lorsque j'écrète à travers chaque action ou quand j'obtiens la liste des contrôleurs et des actions – Rossco