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 avoir plusieurs 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
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
}
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.
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.
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?
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
.
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.