Plusieurs de mes actions de contrôleur ont un ensemble standard de comportement de manipulation de défaillance. En général, je veux:
Ces étapes sont si standardisées que je veux avoir un code réutilisable pour mettre en œuvre le comportement. P>
Mon plan d'attaque actuel était d'avoir une méthode d'assistance pour faire quelque chose comme ceci: p> 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. P> Quel est le meilleur moyen de créer un point de vue de l'extérieur contrôleur particulier? p> p>
4 Réponses :
Comme je l'écrivais, je pensais d'une manière. p>
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 (). P>
Je n'aime pas cela particulièrement parce que c'est Nécessite l'héritage de travailler , mais c'est toujours une option. P>
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 () code> appelé
greveView () code> 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.
Une autre manière utiliserait des décorateurs: et peut-être une méthode d'extension pour le rendre plus propre: p> vous pouvez alors simplement Dites: p> dans votre contrôleur. p> p>
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.
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;
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. Un peu tard dans la journée, mais cela a fonctionné pour moi. P> P>