Doit ASP.NET MVC Controller Methods Return ActionResult?

étant nouveau à ASP.NET MVC, je me suis posé des questions sur la signature des méthodes de contrôle. Dans tous les exemples que j'ai vus, ils semblent toujours retourner ActionResult, même s'ils renvoient une instance ViewResult ou similaire.

voici un exemple courant:

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 obtenir un support de type plus fort?

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

je me rends compte qu'il peut y avoir des situations où le polymorphisme est souhaité (par exemple si vous voulez rediriger seulement dans certaines situations, mais montrer une vue dans d'autres situations), mais si la méthode toujours renvoie une vue, je trouverais une ViewResult plus souhaitable.

en termes de compatibilité future, ActionResult fournit évidemment une signature plus robuste, mais si l'on contrôle base de code complète, il est toujours possible de changer la signature d'une méthode à un type de retour plus général si cela devrait devenir nécessaire dans le futur.

y a-t-il d'autres considérations dont je ne suis pas au courant, ou devrais-je simplement aller de l'avant et déclarer mes méthodes de controller avec des types de retour spécifiques?

55
demandé sur HerbalMart 2009-06-20 17:01:43

6 réponses

vous pouvez absolument utiliser des types de retour spécifiques, même si la plupart des exemples sur le web semble renvoyer le ActionResult . Le seul moment où je retournerais la classe ActionResult est lorsque différents chemins de la méthode d'action retourne différents sous-types.

Steven Sanderson recommande également de retourner 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 expressément qu'elle renvoie une instance de ViewResult. Cela fonctionnerait exactement de la même façon si le type de retour de méthode était ActionResult (la classe de base pour tous les résultats d'action). En fait, certains ASP.NET les programmeurs MVC déclarent toutes leurs méthodes d'action comme retournant un résultat D'action non spécifique, même s'ils savent avec certitude qu'il retournera toujours une sous-classe particulière. Cependant, c'est un principe bien établi dans l'orientation objet programmer que les méthodes devraient retourner le type le plus spécifique qu'elles peuvent (en plus d'accepter les types de paramètres les plus généraux qu'elles peuvent). En suivant ce principe maximise la commodité et la flexibilité pour le code qui appelle votre méthode, comme les tests de votre unité."

56
répondu BengtBe 2009-07-01 08:17:47

toujours retourner le type le plus précis que vous pouvez retourner. Ainsi, vous devriez retourner un ViewResult quand l'action montre toujours une vue. Je n'utiliserais ActionResult que lorsque vous retournez dans ViewResult dans certains cas (données postées invalides) ou un RedirectToRouteResult dans d'autres cas.

avec quelques scénarios actionfilter / execution avancés, vous pouvez même retourner des choses totalement différentes qui n'ont rien à voir avec ActionResult.

13
répondu Paco 2013-08-19 20:12:56

[réponse Partielle]: Vous n'avez pas toujours de retour ActionResult pas. Voici une vue rapide d'autres résultats que vous pouvez retourner: http://msdn.microsoft.com/en-us/library/dd410269%28v=vs.98%29.aspx

peut-être que ça aidera un peu. Bonne chance!

8
répondu Carl 2013-07-01 20:18:47

Oui, vous pouvez définir votre action comme: public ViewResult Index() . Mais parfois votre action peut rapporter des résultats différents (il est impossible sans déclarer le résultat comme 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(...);
}
7
répondu eu-ge-ne 2009-06-20 13:40:42

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

3
répondu GalacticCowboy 2009-06-20 14:12:45

Yep 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 vexait quand je regardais d'autres exemples d'action de contrôleur. Ma philosophie même b4 MVC d'apprentissage était que puisque les fonctions (méthodes qui renvoient une valeur) doivent être traitées comme si vous déclariez une variable / être substituable dans le contexte d'une variable / réf du même type, être spécifique sur le type, comme vous le feriez si déclarer un var (pensez-y comme voulant éviter de vos variables en tant que type "objet" dans une application - plus robuste, mais vous perdez un certain contrôle de temps de conception et de la sécurité de type). Facilite un test de l'Unité de commande pour le type de retour correct aussi bien.

pour référence, consultez le principe de substitution de Listkov (le" L "dans" solide") aussi.

2
répondu Galaxis 2012-03-14 21:18:51