Was ist der Unterschied zwischen ViewResult()
und ActionResult()
in ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
ActionResult ist eine abstrakte Klasse, die mehrere Untertypen haben kann.
ViewResult - Rendert eine angegebene Ansicht für den Antwortstream
PartialViewResult - Rendert eine angegebene Teilansicht für den Antwortstream
EmptyResult - Eine leere Antwort wird zurückgegeben
RedirectResult - Führt eine HTTP-Umleitung zu einer angegebenen URL durch
RedirectToRouteResult - Führt eine HTTP-Umleitung zu einer URL durch, die vom Routingmodul __. basierend auf den angegebenen Routendaten bestimmt wird
JsonResult - Serialisiert ein bestimmtes ViewData-Objekt im JSON-Format
JavaScriptResult - Gibt einen Teil des JavaScript-Codes zurück, der auf dem Client ausgeführt werden kann
ContentResult - Schreibt Inhalt in den Antwortstream, ohne dass eine Ansicht erforderlich ist
FileContentResult - Gibt eine Datei an den Client zurück
FileStreamResult - Gibt eine Datei an den Client zurück, die von einem Stream bereitgestellt wird
FilePathResult - Gibt eine Datei an den Client zurück
ActionResult ist eine abstrakte Klasse.
ViewResult leitet sich von ActionResult ab. Andere abgeleitete Klassen umfassen JsonResult und PartialViewResult .
Sie deklarieren es auf diese Weise, damit Sie den Polymorphismus nutzen und verschiedene Typen mit derselben Methode zurückgeben können.
z.B:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
Aus demselben Grund schreiben Sie nicht jede Methode jeder Klasse, um "object" zurückzugeben. Sie sollten so genau wie möglich sein. Dies ist besonders nützlich, wenn Sie Komponententests schreiben möchten. Keine weiteren Rückgabetypen und/oder das Ergebnis.
ViewResult ist eine Unterklasse von ActionResult. Die View-Methode gibt ein ViewResult zurück. Also machen diese beiden Codeausschnitte genau das gleiche. Der einzige Unterschied besteht darin, dass Ihr Controller mit ActionResult keine Aussicht verspricht, eine Ansicht zurückzugeben. Sie können den Methodentext so ändern, dass er ein RedirectResult oder etwas anderes zurückgibt, ohne die Methodendefinition zu ändern.
Beachten Sie, dass bei anderen Antworten die Unterschiede richtig notiert wurden. Wenn Sie tatsächlich nur ViewResult zurückgeben, ist es besser, den spezifischeren Typ als den Basistyp ActionResult zurückzugeben. Eine offensichtliche Ausnahme von diesem Prinzip besteht darin, dass Ihre Methode mehrere von ActionResult abgeleitete Typen zurückgibt.
Eine ausführliche Beschreibung der Gründe für dieses Prinzip finden Sie in der zugehörigen Diskussion hier: Muss ASP.NET MVC Controller-Methoden ActionResult zurückgeben?
Im Controller könnte man die folgende Syntax verwenden
public ViewResult EditEmployee() {
return View();
}
public ActionResult EditEmployee() {
return View();
}
Im obigen Beispiel variiert nur der Rückgabetyp. Eine gibt ViewResult
zurück, während die andere ActionResult
zurückgibt.
ActionResult ist eine abstrakte Klasse. Es kann akzeptieren:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult usw.
Die ViewResult
ist eine Unterklasse von ActionResult
.
In Controller habe ich den folgenden Code mit ActionResult angegeben, einer Basisklasse, die 11 Untertypen in MVC enthalten kann, wie: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, .__ , 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
}
Ebenso können wir alle diese 11 Subtypen mit ActionResult () zurückgeben, ohne jede Subtype-Methode explizit anzugeben. ActionResult ist das Beste, wenn Sie unterschiedliche Arten von Ansichten zurückgeben.