12
votes

Création des visiteursSults en dehors des contrôleurs dans ASP.NET MVC

Plusieurs de mes actions de contrôleur ont un ensemble standard de comportement de manipulation de défaillance. En général, je veux:

  • chargez un objet basé sur les données de route (IDS et similaires)
    • Si les données d'itinéraire ne pointe pas sur un objet valide (Ex: via URL piratage), informez l'utilisateur du problème et renvoyez un site http 404 non trouvé
    • validez que l'utilisateur actuel a les autorisations appropriées sur l'objet
      • Si l'utilisateur n'a pas l'autorisation, informez l'utilisateur du problème et renvoyez un HTTP 403 interdit
      • Si ce qui précède est réussi, faites quelque chose avec cet objet spécifique à l'action (c.-à-d .: Rendez-le dans une vue).

        Ces étapes sont si standardisées que je veux avoir un code réutilisable pour mettre en œuvre le comportement.

        Mon plan d'attaque actuel était d'avoir une méthode d'assistance pour faire quelque chose comme ceci: xxx

        Le problème ici est que Controller.View () est une méthode protégée et n'est donc pas accessible depuis un assistant. J'ai examiné de créer un nouvel exemple de visiteux explicitement, mais il y a suffisamment de propriétés à définir que je me méfie de le faire sans connaître les pièges en premier.

        Quel est le meilleur moyen de créer un point de vue de l'extérieur contrôleur particulier?


0 commentaires

4 Réponses :


5
votes

Comme je l'écrivais, je pensais d'une manière.

Plutôt que d'avoir le code ci-dessus dans une aide, je pourrais la mettre dans une sous-classe de contrôleur, puis sous-classe cette classe pour mes contrôleurs réels. Cela me permettrait d'appeler la méthode de la vue protégée ().

Je n'aime pas cela particulièrement parce que c'est Nécessite l'héritage de travailler , mais c'est toujours une option.


2 commentaires

La chose que je n'aime pas à propos de ceci est que cela signifie qu'un contrôleur ne peut avoir qu'un ensemble de comportement d'action partagé: celui qu'il hérite (seul) hérite. Pour cet exemple particulier, ce n'est pas un problème, mais je peux le voir devenir beaucoup plus lourd car le projet grandit.


Je réalise que votre question est d'ans, mais je pensais juste que je mentionnerais une autre possibilité. Vous pouvez exposer une version publique de Affichage () appelé greveView () sur votre contrôleur de base, vous pouvez maintenir votre assistant dans une classe distincte. Vous auriez toujours besoin de transmettre votre contrôleur dans votre aide, ce qui est un peu maladroit, mais cela permet une composition au lieu de héritage.



0
votes

Une autre manière utiliserait des décorateurs: xxx

et peut-être une méthode d'extension pour le rendre plus propre: xxx

vous pouvez alors simplement Dites: xxx

dans votre contrôleur.


1 commentaires

Cela ne vous aide pas vraiment, car vous devez toujours créer le point de vue de la base dans le contrôleur, ce que j'essaie de vous échapper.



1
votes

J'ai eu la même question et j'ai répondu différemment. Je ne voulais vraiment pas utiliser l'héritage pour cela, j'ai donc utilisé une lambda à la place.

Premièrement, j'ai un objet que je passe de mon contrôleur à la méthode que je souhaite retourner la vue: P>

// In the controller
var context = new DocsControllerContext()
{
    Request = Request,
    Response = Response,
    Controller = this,
    ViewResult = (viewName, model) =>
    {
        return View(viewName, model);
    }
};

var returnValue = methodInfo.Invoke(toInvoke, new object[] { context });
return returnValue;


0 commentaires

6
votes

Il suffit de lire ce poste car j'avais le même problème d'un filtre d'action. Ma solution créait explicitement l'action de vue. Ceci est basé sur la méthode de la vue protégée () selon la source MVC afin de remplir les propriétés requises. Quoi qu'il en soit, semble fonctionner sans problèmes. XXX

Un peu tard dans la journée, mais cela a fonctionné pour moi.


0 commentaires