Les méthodes de contrôleur ASP.NET MVC doivent-elles renvoyer ActionResult?

Étant nouveau sur ASP.NET MVC, je me suis interrogé sur la signature des méthodes Controller. Dans tous les exemples que j’ai vus, ils semblent toujours renvoyer ActionResult, même s’ils renvoient une instance de ViewResult ou similaire.

Voici un exemple communément vu:

public ActionResult Index() { return this.View(); } 

Dans un tel cas, ne serait-il pas plus logique de déclarer la méthode en tant que public ViewResult Index() et d’obtenir un support de type plus fort?

L’expérimentation indique que cela fonctionne, il semble donc possible.

Je me rends compte qu’il peut y avoir des situations où le polymorphism est désiré (par exemple si vous voulez redirect uniquement dans certaines situations, mais afficher une vue dans d’autres situations), mais si la méthode retourne toujours une vue, je trouverais plus de ViewResult souhaitable.

En termes de compatibilité future, ActionResult fournit évidemment une signature plus robuste, mais si l’on contrôle l’intégralité de la base de code, il est toujours possible de changer la signature d’une méthode pour un type de retour plus général.

Les autres considérations que je ne connais pas, ou devrais-je simplement aller de l’avant et déclarer mes méthodes de contrôleur avec des types de retour spécifiques?

Vous pouvez absolument utiliser des types de retour spécifiques, même si la plupart des exemples sur le Web semblent renvoyer ActionResult . La seule fois où je retournerais la classe ActionResult , c’est lorsque différents chemins de la méthode d’action renvoient des sous-types différents.

Steven Sanderson recommande également de renvoyer des types spécifiques dans son livre Pro ASP.NET MVC Framework . Jetez un oeil à la citation ci-dessous:

“Cette méthode d’action déclare spécifiquement qu’elle retourne une instance de ViewResult. Elle fonctionnerait de la même manière si, au lieu de cela, le type de retour de la méthode était ActionResult (la classe de base pour tous les résultats d’action). Certains programmeurs ASP.NET MVC déclarent tous leurs les méthodes d’action comme le retour d’un ActionResult non spécifique, même si elles savent avec certitude qu’elles renverront toujours une sous-classe particulière, mais c’est un principe bien établi en programmation orientée object que les méthodes doivent renvoyer le type le plus spécifique possible (ainsi que en acceptant les types de parameters les plus généraux possibles. En suivant ce principe, vous optimisez la commodité et la flexibilité du code qui appelle votre méthode, comme vos tests unitaires. “

Retournez toujours le type le plus précis que vous pouvez retourner. Vous devez donc retourner un ViewResult lorsque l’action affiche toujours une vue. J’utiliserais uniquement ActionResult lorsque vous renverriez dans ViewResult dans certains cas (données publiées non valides) ou un RedirectToRouteResult dans d’autres cas.

Avec certains filtres d’action / scénarios d’exécution avancés, vous pouvez même renvoyer des choses totalement différentes qui n’ont rien à voir avec ActionResult.

[Réponse partielle]: Vous ne retournez pas toujours ActionResult, non. Voici un aperçu des autres résultats que vous pouvez obtenir: http://msdn.microsoft.com/en-us/library/dd410269%28v=vs.98%29.aspx

Peut-être que ça va aider un peu. Bonne chance!

Oui, vous pouvez définir votre action comme public ViewResult Index() : public ViewResult Index() . Mais parfois, votre action peut renvoyer des résultats différents (cela est impossible sans déclarer le résultat comme classe ActionResult base). Par exemple:

 public ActionResult Show() { ... if(Request.IsAjaxRequest()) { return PartialView(...); } return View(...); } 

ou:

 public ActionResult Show() { ... try { ... } catch(Exception) { return RedirectToAction(...); } return View(...); } 

ActionResult est la classe de base pour les différents types de retour. Ainsi, votre action doit renvoyer un ActionResult ou une classe dérivée de celui-ci pour fonctionner. Les plus courants sont ViewResult , JsonResult , etc.

Oui, j’ai le livre de Sanderson, et j’ai aimé cette partie sur le fait d’être spécifique, car c’était quelque chose qui me contrariait lorsque je regardais d’autres exemples d’action de contrôleurs. Ma philosophie même b4 learning MVC était que, puisque les fonctions (méthodes qui renvoient une valeur) devraient être traitées comme si vous déclariez une variable / être substituable en contexte pour une variable / ref du même type, soyez spécifique sur le type, comme vous Si vous déclariez une variable (pensez à éviter de définir toutes les variables comme type “Object” dans une application – plus robuste, mais vous perdez un peu de contrôle lors de la conception et de sécurité de type). Facilite également le test d’unité de contrôleur pour le type de retour correct.

Pour la référence associée, consultez également le principe de substitution de Listkov (le “L” dans “SOLID”).