web-dev-qa-db-fra.com

Différence entre ViewResult () et ActionResult ()

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

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

public ActionResult Index()
{
    return View();
}
289
Domnic

ActionResult est une classe abstraite pouvant avoir plusieurs sous-types.

ActionResult Sous-types

  • ViewResult - Rend une vue spécifiée au flux de réponses

  • PartialViewResult - Génère une vue partielle spécifiée du flux de réponses

  • EmptyResult - Une réponse vide est renvoyée.

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

  • RedirectToRouteResult - Effectue une redirection HTTP vers une URL déterminée par le moteur de routage , En fonction des données de routage données.

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

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

  • ContentResult - Écrit le contenu dans le flux de réponses sans nécessiter de vue.

  • FileContentResult - Renvoie un fichier au client

  • FileStreamResult - Renvoie un fichier au client, fourni par un flux

  • FilePathResult - Renvoie un fichier au client

Ressources

363
Divi

ActionResult est une classe abstraite.

ViewResult provient de ActionResult . Les autres classes dérivées incluent JsonResult et PartialViewResult .

Vous le déclarez de cette façon pour pouvoir tirer parti 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
}
117
RPM1984

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

31
RickAndMSFT

ViewResult est une sous-classe de 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 ActionResult, votre contrôleur ne promet pas de retourner une vue. Vous pouvez modifier le corps de la méthode pour renvoyer conditionnellement un RedirectResult ou autre chose sans changer la définition de la méthode.

20
Robert Levy

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

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

11
Zaid Masud

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. un retourne ViewResult alors que l'autre retourne ActionResult.

ActionResult est une classe abstraite. Il peut accepter:

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

ViewResult est une sous-classe de ActionResult.

4
ruchit

Dans Controller, j’ai spécifié le code ci-dessous avec ActionResult, qui est une classe de base pouvant comporter 11 sous-types dans MVC, tels que: FileStreamResult, 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 ces 11 sous-types en utilisant ActionResult () sans spécifier explicitement chaque méthode de sous-type . ActionResult est ce qu'il y a de mieux si vous renvoyez différents types de vues. 

0
Abhishek Duppati