8
votes

Comment ASP.NET MVC sait-il qu'une méthode est une méthode d'action?

J'essaie d'écrire un test unitaire qui bouclera toutes les méthodes d'action sur mes classes de contrôleur à la recherche de méthodes d'action qui ne disposent pas d'un attribut de sécurité (par exemple [Autoriser]).

Comment le moteur de routage ASP.NET détermine-t-il quelles méthodes sont des méthodes d'action? De toute évidence, les méthodes d'action doivent être publiques, mais des méthodes telles que Tostring () ne sont pas des méthodes d'action, il y a donc une certaine logique à cela.


0 commentaires

3 Réponses :


8
votes

Toutes les méthodes d'un contrôleur sont des actions considérées comme des méthodes non publiques.

Premièrement, les méthodes sont assorties par nom: MethodName = ActionName.

Si vous souhaitez remplacer le comportement par défaut, Vous utilisez un attribut [actionName]. xxx

alors cette méthode se déclenchera lorsqu'un http: //..../actiony URL est demandé.

En savoir plus dans Phil's Blog: Comment une méthode devient une action

EDIT: D'accord, peut-être que celui-ci: Toutes les méthodes publiques définies directement dans votre classe de contrôleur, non héritées des classes de base, qui ne remplacent pas les celles des classes de base, à moins que vous identifiez de manière récursive ces méthodes de base pour être déjà des actions, non décorées avec un attribut Noaction.


5 commentaires

"Toutes les méthodes d'un contrôleur sont considérées comme des actions, à l'exception des méthodes non publiques." - Pas vrai, Tostring () est une méthode publique mais n'est pas une méthode d'action.


Pour ajouter à cela, vous pouvez également ajouter un attribut [NONACTION] à une méthode publique si vous en avez besoin pour être public à des fins de test de l'unité.


D'accord, celui-ci n'est évidemment pas, mais vous avez eu l'idée générale. Vous héritez de la classe du contrôleur et quelles méthodes publiques que vous définissez là-bas deviendra vos actions.


@MasterMind - Je sais que je suis difficile, mais mon objectif est d'écrire un test unitaire qui vérifie qu'il existe un attribut liés à la sécurité sur toutes les méthodes d'action, je dois donc avoir le même algorithme que le moteur de routage utilise.


@Jon Kruger upvote pour cette idée du test unitaire. Je me souviens bien. :)



1
votes

J'ai arrêté d'être paresseux et j'ai trouvé la réponse, la plupart d'entre eux était dans system.web.mvc.actionmetelookelector.populatelookesthables () (merci réflecteur!)

    private IEnumerable<MethodInfo> GetActionMethods(Type controllerType)
    {
        return Array.FindAll(controllerType.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance), IsValidActionMethod);
    }

    private static bool IsValidActionMethod(MethodInfo methodInfo)
    {
        return (!methodInfo.IsSpecialName && !methodInfo.GetBaseDefinition().DeclaringType.IsAssignableFrom(typeof(Controller)) && 
            !methodInfo.GetCustomAttributes(typeof(NonActionAttribute), true).Any());
    }


1 commentaires

Si vous avez besoin de toutes vos méthodes d'action dans un contrôleur pour avoir le filtre [Autoriser] sur eux, je suis sûr que vous pouvez simplement l'ajouter au sommet du contrôleur. Il a le même effet que l'ajout à chaque action. Je ne crois pas que cela affectera les méthodes non-actions, mais je pourrais me tromper à ce sujet.



1
votes

Il y a une très belle explication de la manière dont les méthodes d'action sont traitées dans le livre ASP.NET MVC que j'utilise pour référence. Comme cela se produit, les pages correspondantes sont disponibles sur Google Books:

http: // livres .google.com / livres? id = xb3a1xtsfzgc & lpg = PA308 & OTS = J9GGXHSADS & DQ = Action% 20method% 20Selection% 20Sanderson & pg = PA310

Si le lien meurt, c'est la page 310 de Pro ASP.NET Cadre MVC par Steven Sanderson.

Je ne sais pas que cela vous aidera à déterminer comment écrire vos tests d'unité, mais cela pourrait vous aider à suivre le code de réflecteur ...


1 commentaires

C'est un excellent article! Merci!