Question

Étant nouveau dans 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 en fait une instance ViewResult ou similaire.

Voici un exemple couramment observé:

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

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

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

Je réalise qu’il peut exister des situations dans lesquelles le polymorphisme est souhaité (par exemple, si vous ne souhaitez rediriger que dans certaines situations, mais affichez une vue dans d’autres situations), mais si la méthode toujours renvoie une vue, je trouverais un ViewResult plus souhaitable.

En termes de compatibilité future, ActionResult fournit évidemment une signature plus robuste, mais si vous contrôlez la base de code entière, il est toujours possible de changer la signature d'une méthode en un type de retour plus général si cela devenait nécessaire à l'avenir.

Existe-t-il d'autres considérations dont je ne suis pas au courant ou dois-je simplement déclarer les méthodes de mon contrôleur avec des types de retour spécifiques?

Était-ce utile?

La solution

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

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

"Cette méthode d'action déclare spécifiquement qu'elle retourne une instance de ViewResult. Cela 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). En fait, certains programmeurs ASP.NET MVC déclarent que toutes leurs méthodes d'action renvoient un ActionResult non spécifique, même s'ils savent avec certitude qu'il renverra toujours une sous-classe particulière. Cependant, la programmation orientée objet repose sur le principe selon lequel les méthodes doivent renvoyer le type le plus spécifique possible (ainsi que les types de paramètres les plus généraux possibles). Suivre ce principe optimise la commodité et la flexibilité du code qui appelle votre méthode, tel que vos tests unitaires. "

Autres conseils

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

Avec certains scénarios d'actionfilter / executing avancés, vous pouvez même renvoyer des choses totalement différentes qui n'ont rien à voir avec ActionResult.

[Réponse partielle]: Vous ne renvoyez pas toujours ActionResult, non. Voici un aperçu des autres résultats que vous pouvez renvoyer: 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 suit: public ViewResult Index () . Mais parfois, votre action peut retourner des résultats différents (il est impossible sans déclarer le résultat en tant que classe de base ActionResult ). 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 qui en dérive pour fonctionner. Les plus courants sont ViewResult , JsonResult , etc.

Oui, j'ai le livre de Sanderson, et j'aimais cette partie de la précision, car c'était quelque chose qui me vexait quand je regardais d'autres exemples d'action de contrôleur. Ma philosophie, même b4 learning MVC, était que, puisque les fonctions (méthodes qui renvoient une valeur) doivent être traitées comme si vous déclariez une variable / soyez substituable dans le contexte d’une variable / ref du même type, soyez spécifique du type, si vous déclariez une variable (pensez-y, évitez de définir toutes vos variables comme un type "Objet" dans une application - plus robuste, mais vous perdez un peu de contrôle au moment de la conception et de sécurité du type). Facilite également le test du contrôleur pour le type de retour correct.

Pour plus d'informations, consultez le principe de substitution de Listkov (le "L" dans "SOLID") également.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top