2010-09-14 2 views
2

Lorsque mon application est initialisée, je veux créer un registre de toute action MVC dont la méthode a un certain CustomAttribute dessus. Je veux que ce registre garde une trace de la zone MVC, du contrôleur et de l'action. I pourrait exiger que la personne ajoute l'attribut pour spécifier cette information, mais il semble que je devrais être capable de comprendre cette information basée sur le MethodInfo: fondamentalement l'inverse de ce qui se passe lorsque la méthode ActionLink est appelée. Comment puis-je faire ceci?Comment puis-je obtenir des informations d'action MVC à partir de MethodInfo de l'action?

Répondre

4

Effectuez une recherche dans l'ensemble pour Controller, puis effectuez une recherche parmi toutes les méthodes pour trouver celles qui ont un certain attribut.

// current assembly -> all types that have basetype controller -> grab methods 
foreach(var type in System.Reflection.Assembly.GetCallingAssembly().GetTypes().Where(t=> 
    typeof(Controller).IsAssignableFrom(t)))) 
{ 
    foreach(var methodInfo in type.GetMethods()) 
    { 
     if (methodInfo.GetCustomAttributes(typeof(MyAttribute), false).Count() > 0) 
     { 
      var action = methodInfo.Name; 
      var controller = type.Name; 
     } 
    } 
} 
+0

C'est le "// Do Something" que j'essaie de vous demander ici. Supposons que vous ayez le MethodInfo: maintenant comment obtenez-vous le nom MVC Area, Controller et Action? – StriplingWarrior

+3

A changé mon échantillon. Ne pas savoir sur la zone cependant: une zone n'est pas étroitement liée à une action du contrôleur ou quoi? Je suppose que vous voulez regarder dans 'RouteCollection' s'il y a une zone avec le nom du contrôleur et l'action que vous avez dans les variables. –

+1

Je suggère d'utiliser l'espace de noms pour le problème de zone, car il est très probable que les contrôleurs de zone partagent un espace de noms commun. – eglasius

Questions connexes