Quelle est la différence entre ViewResult()
et ActionResult()
dans ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Quelle est la différence entre ViewResult()
et ActionResult()
dans ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Réponses:
ActionResult est une classe abstraite qui peut avoir plusieurs sous-types.
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
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
}
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.
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.
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?
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 ViewResult
alors 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 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 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.
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.