Unterschied zwischen ViewResult () und ActionResult ()

295

Was ist der Unterschied zwischen ViewResult()und ActionResult()in ASP.NET MVC?

public ViewResult Index()
{
    return View();
}

public ActionResult Index()
{
    return View();
}
Domnic
quelle
12
Gute Frage. Ich habe mir ein Video angesehen und um Unit-Tests zu erstellen, hat der Kursleiter zuerst den Rückgabetyp der Aktion, die er testen wollte, von ActionResult in ViewResult geändert. Keine Erklärung ... Ich sagte: "Was können wir nur zufällig ändern? Ohne Erklärung"
Doug Chamberlain
3
Wahrscheinlich ist diese Dokumentation hilfreich :) msdn.microsoft.com/en-us/library/…
user3885927

Antworten:

372

ActionResult ist eine abstrakte Klasse, die mehrere Untertypen haben kann.

ActionResult-Subtypen

  • 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

Ressourcen

Divi
quelle
5
Was ist der Vorteil der Rückgabe von ViewResult gegenüber ActionResult - ist es nur ein bisschen semantischer und zeigt Ihre Absicht - aber in der Praxis macht es normalerweise keinen Unterschied?
Niico
121

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
}
RPM1984
quelle
2
Bedeutet dies, dass wir ActionResult immer zurückgeben sollten, damit wir den Vorteil daraus ziehen können? Oder gibt es eine Einschränkung oder Nebenwirkung davon?
Adarsh ​​Kumar
5
@Adarsh ​​- es ist das gleiche mit jeder abstrakten Klasse in C #. Deklarieren Sie dies so, wenn Sie die Implementierung in die Methode einkapseln oder Ihre API für andere abgeleitete typisierte Elemente zukunftssicher machen möchten. Wenn nicht, verwenden Sie den Beton. Ich benutze im Allgemeinen den Beton (zB ViewResult oder JsonResult)
RPM1984
31

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.

RickAndMSFT
quelle
Sauberere Code- und Unit-Tests sind der Vorteil der Verwendung von ViewResult, basierend auf meinen Erfahrungen.
JoshYates1980
20

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.

Robert Levy
quelle
11

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?

Zaid Masud
quelle
4

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.

Ruchit
quelle
4
Ich bin mir nicht sicher, ob Sie das gemeint haben, aber nur für den Fall, dass ich klarstellen möchte, dass Sie diese beiden Methoden nicht gleichzeitig verwenden können, da ihr Name und (keine) Parameter identisch sind. Es ist nicht möglich, eine Methode zu überladen, indem nur der Ergebnistyp geändert wird.
Andrew
0

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.

Abhishek Duppati
quelle
0

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.

wjxie
quelle