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(); } 

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

Sous-types ActionResult

  • ViewResultAffiche une vue spécifiée dans le stream de réponses

  • PartialViewResultAffiche une vue partielle spécifiée dans le stream de réponses

  • EmptyResult – Une réponse vide est renvoyée

  • RedirectResult – Exécute une redirection HTTP vers une URL spécifiée

  • RedirectToRouteResult – Exécute 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 object 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 stream de réponses sans nécessiter de vue

  • FileContentResult – Retourne un fichier au client

  • FileStreamResult – Retourne un fichier au client, fourni par un stream

  • FilePathResult – Retourne un fichier au client

Ressources

  • Quelle est la différence entre ActionResult et ViewResult pour la méthode d’action? [Forums ASP.NET]

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 manière afin que vous puissiez tirer parti du polymorphism 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 } 

C’est pour la même raison que vous n’écrivez pas toutes les méthodes de chaque classe pour renvoyer “object”. Vous devriez ê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.

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 que, avec ActionResult, votre contrôleur ne promet pas de retourner une vue – vous pouvez changer le corps de la méthode pour renvoyer conditionnellement un RedirectResult ou autre sans changer la définition de la méthode.

Bien que d’autres réponses aient noté les différences correctement, notez que si vous retournez un ViewResult, 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érivant d’ActionResult.

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

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 renvoie ViewResult tandis que l’autre renvoie 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 .

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

  public ActionResult Index() { if (HttpContext.Session["LoggedInUser"] == null) { return RedirectToAction("Login", "Home"); } else { return View(); // returns ViewResult } } //More Examples [HttpPost] public ActionResult Index(ssortingng Name) { ViewBag.Message = "Hello"; return Redirect("Account/Login"); //returns RedirectResult } [HttpPost] public ActionResult Index(ssortingng Name) { return RedirectToRoute("RouteName"); // returns RedirectToRouteResult } 

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