Was ist der Unterschied zwischen ViewResult()und ActionResult()in ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Was ist der Unterschied zwischen ViewResult()und ActionResult()in ASP.NET MVC?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Antworten:
ActionResult ist eine abstrakte Klasse, die mehrere Untertypen haben kann.
ViewResult - Rendert eine bestimmte Ansicht des Antwortstroms
PartialViewResult - Rendert eine bestimmte Teilansicht des Antwortstroms
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 von der Routing-Engine basierend auf den angegebenen Routendaten festgelegt wird
JsonResult - Serialisiert ein bestimmtes ViewData-Objekt in das JSON-Format
JavaScriptResult - Gibt einen Teil des JavaScript-Codes zurück, der auf dem Client ausgeführt werden kann
ContentResult - Schreibt Inhalte in den Antwortstrom, 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 dies auf diese Weise, damit Sie den Polymorphismus nutzen und verschiedene Typen in derselben Methode zurückgeben können.
z.B:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
Aus dem gleichen Grund schreiben Sie nicht jede Methode jeder Klasse, um "Objekt" zurückzugeben. Sie sollten so genau wie möglich sein. Dies ist besonders nützlich, wenn Sie Unit-Tests schreiben möchten. Keine Rückgabetypen mehr testen und / oder das Ergebnis gießen.
ViewResult ist eine Unterklasse von ActionResult. Die View-Methode gibt ein ViewResult zurück. Diese beiden Codefragmente machen also genau dasselbe. Der einzige Unterschied besteht darin, dass Ihr Controller mit ActionResult nicht verspricht, eine Ansicht zurückzugeben. Sie können den Methodenkörper so ändern, dass er ein RedirectResult oder etwas anderes bedingt zurückgibt, ohne die Methodendefinition zu ändern.
Während andere Antworten die Unterschiede korrekt notiert haben, ist es besser, wenn Sie tatsächlich nur ein ViewResult zurückgeben, den spezifischeren Typ anstelle des ActionResult-Basistyps zurückzugeben. Eine offensichtliche Ausnahme von diesem Prinzip besteht darin, dass Ihre Methode mehrere Typen zurückgibt, die von ActionResult abgeleitet sind.
Eine vollständige Erläuterung der Gründe für dieses Prinzip finden Sie in der entsprechenden Erläuterung hier: Müssen 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. einer kehrt zurück, ViewResultwährend der andere zurückkehrt ActionResult.
ActionResult ist eine abstrakte Klasse. Es kann akzeptieren:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult usw.
Das ViewResultist eine Unterklasse von ActionResult.
In Controller habe ich den folgenden Code mit ActionResult angegeben, einer Basisklasse, die 11 Untertypen in MVC haben kann, wie: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStream.
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 Subtypmethode explizit anzugeben. ActionResult ist das Beste, wenn Sie verschiedene Arten von Ansichten zurückgeben.
Um Ihnen Zeit zu sparen, finden Sie hier die Antwort von einem Link in einer früheren Antwort unter https://forums.asp.net/t/1448398.aspx
ActionResult ist eine abstrakte Klasse und die Basisklasse für die ViewResult-Klasse.
Im MVC-Framework wird die ActionResult-Klasse verwendet, um auf das Objekt zu verweisen, das Ihre Aktionsmethode zurückgibt. Und ruft die ExecuteResult-Methode auf.
Und ViewResult ist eine Implementierung für diese abstrakte Klasse. Es wird versucht, eine Ansichtsseite (normalerweise eine Aspx-Seite) in einigen vordefinierten Pfaden (/ views / controllerername /, / views / shared / usw.) anhand des angegebenen Ansichtsnamens zu finden.
Es ist normalerweise eine gute Praxis, wenn Ihre Methode eine spezifischere Klasse zurückgibt. Wenn Sie also sicher sind, dass Ihre Aktionsmethode eine Ansichtsseite zurückgibt, können Sie ViewResult verwenden. Wenn Ihre Aktionsmethode jedoch ein anderes Verhalten aufweist, z. B. eine Ansicht rendern oder eine Umleitung durchführen. Sie können die allgemeinere Basisklasse ActionResult als Rückgabetyp verwenden.