Différence entre ViewResult () et ActionResult ()

295

Quelle est la différence entre ViewResult()et ActionResult()dans ASP.NET MVC?

public ViewResult Index()
{
    return View();
}

public ActionResult Index()
{
    return View();
}
Domnic
la source
12
Grande question. J'ai regardé une vidéo et pour créer des tests unitaires, l'instructeur a d'abord changé le type de retour de l'action qu'il allait tester d'ActionResult à ViewResult. Aucune explication .... Je me disais "Qu'est-ce qu'on peut changer de types au hasard? Sans explication"
Doug Chamberlain
3
Cette documentation est probablement utile :) msdn.microsoft.com/en-us/library/…
user3885927

Réponses:

372

ActionResult est une classe abstraite qui peut avoir plusieurs sous-types.

Sous-types ActionResult

  • ViewResult - Rend une vue spécifique au flux de réponse

  • PartialViewResult - Rend une vue partielle spécifiée au flux de réponse

  • EmptyResult - Une réponse vide est retournée

  • RedirectResult - Effectue une redirection HTTP vers une URL spécifiée

  • RedirectToRouteResult - Effectue une redirection HTTP vers une URL qui est déterminée par le moteur de routage, en fonction des données d'itinéraire données

  • JsonResult - Sérialise un objet ViewData donné au format JSON

  • JavaScriptResult - Retourne un morceau de code JavaScript qui peut être exécuté sur le client

  • ContentResult - Écrit du contenu dans le flux de réponse sans avoir besoin d'une vue

  • FileContentResult - Retourne un fichier au client

  • FileStreamResult - Retourne un fichier au client, qui est fourni par un Stream

  • FilePathResult - Retourne un fichier au client

Ressources

Divi
la source
5
quel est l'avantage de renvoyer ViewResult par rapport à ActionResult - est-ce juste un peu plus sémantique et montre votre intention - mais en pratique ne fait généralement aucune différence?
niico
121

ActionResult est une classe abstraite.

ViewResult dérive d' ActionResult . Les autres classes dérivées incluent JsonResult et PartialViewResult .

Vous le déclarez de cette façon afin de pouvoir profiter du polymorphisme et renvoyer différents types dans la même méthode.

par exemple:

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}
RPM1984
la source
2
Cela signifie-t-il que nous devons toujours retourner ActionResult afin d'en tirer parti. Ou y a-t-il une limitation ou un effet secondaire de cela?
Adarsh ​​Kumar
5
@Adarsh ​​- c'est la même chose avec n'importe quelle classe abstraite en C #. Déclarez-le de cette façon si vous souhaitez encapsuler l'implémentation à l'intérieur de la méthode ou souhaitez pérenniser votre API pour d'autres types dérivés. Sinon, utilisez le béton. J'utilise généralement le béton (par exemple ViewResult ou JsonResult)
RPM1984
31

C'est pour la même raison que vous n'écrivez pas toutes les méthodes de chaque classe pour renvoyer "object". Vous devez être aussi précis que possible. Cela est particulièrement utile si vous prévoyez d'écrire des tests unitaires. Plus besoin de tester les types de retour et / ou de lancer le résultat.

RickAndMSFT
la source
Un code plus propre et des tests unitaires sont l'avantage d'utiliser ViewResult en fonction de mon expérience.
JoshYates1980
20

ViewResult est une sous-classe d'ActionResult. La méthode View renvoie un ViewResult. Donc, vraiment, ces deux extraits de code font exactement la même chose. La seule différence est qu'avec l'actionResult, votre contrôleur ne promet pas de retourner une vue - vous pouvez changer le corps de la méthode pour retourner conditionnellement un RedirectResult ou autre chose sans changer la définition de la méthode.

Robert Levy
la source
11

Alors que d'autres réponses ont correctement noté les différences, notez que si vous retournez en fait un ViewResult uniquement, il est préférable de renvoyer le type plus spécifique plutôt que le type ActionResult de base. Une exception évidente à ce principe est lorsque votre méthode retourne plusieurs types dérivés d'ActionResult.

Pour une discussion complète des raisons de ce principe, veuillez consulter la discussion connexe ici: Les méthodes du contrôleur ASP.NET MVC doivent-elles renvoyer ActionResult?

Zaid Masud
la source
4

Dans le contrôleur, on pourrait utiliser la syntaxe ci-dessous

public ViewResult EditEmployee() {
    return View();
}

public ActionResult EditEmployee() {
    return View();
}

Dans l'exemple ci-dessus, seul le type de retour varie. l'un revient ViewResultalors que l'autre revient ActionResult.

ActionResult est une classe abstraite. Il peut accepter:

ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult etc.

Le ViewResultest une sous - classe de ActionResult.

ruchit
la source
4
Je ne sais pas si c'est ce que vous vouliez dire, mais juste au cas où je voudrais clarifier que vous ne pouvez pas avoir ces deux méthodes en même temps, car leur nom et (pas) les paramètres sont les mêmes. Il n'est pas possible de surcharger une méthode en modifiant uniquement le type de résultat.
Andrew
0

Dans Controller, j'ai spécifié le code ci-dessous avec ActionResult qui est une classe de base qui peut avoir 11 sous-types dans MVC comme: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult, FilePathResult

    public ActionResult Index()
                {
                    if (HttpContext.Session["LoggedInUser"] == null)
                    {
                        return RedirectToAction("Login", "Home");
                    }

                    else
                    {
                        return View(); // returns ViewResult
                    }

                }
//More Examples

    [HttpPost]
    public ActionResult Index(string Name)
    {
     ViewBag.Message = "Hello";
     return Redirect("Account/Login"); //returns RedirectResult
    }

    [HttpPost]
    public ActionResult Index(string Name)
    {
    return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
    }

De même, nous pouvons renvoyer tous ces 11 sous-types en utilisant ActionResult () sans spécifier explicitement chaque méthode de sous-type. ActionResult est la meilleure chose si vous retournez différents types de vues.

Abhishek Duppati
la source
0

Pour vous faire gagner du temps, voici la réponse d'un lien dans une réponse précédente à https://forums.asp.net/t/1448398.aspx

ActionResult est une classe abstraite, et c'est la classe de base pour la classe ViewResult.

Dans le framework MVC, il utilise la classe ActionResult pour référencer l'objet renvoyé par votre méthode d'action. Et invoque la méthode ExecuteResult dessus.

Et ViewResult est une implémentation de cette classe abstraite. Il essaiera de trouver une page de vue (généralement une page aspx) dans certains chemins prédéfinis (/ views / controllername /, / views / shared /, etc.) par le nom de vue donné.

C'est généralement une bonne pratique que votre méthode retourne une classe plus spécifique. Donc, si vous êtes sûr que votre méthode d'action retournera une page d'affichage, vous pouvez utiliser ViewResult. Mais si votre méthode d'action peut avoir un comportement différent, comme rendre une vue ou effectuer une redirection. Vous pouvez utiliser la classe de base plus générale ActionResult comme type de retour.

wjxie
la source