Was ist der Zweck einer Aktion, die ActionResult zurückgibt?Was ist der Sinn des ActionResult-Rückgabetyps?
Antwort
ActionResult ist die Basisklasse für viele verschiedene Arten von Controller-Ergebnissen. Durch das Zurückgeben der Basisklasse kann die Controller-Aktion je nach Ergebnis der Methode verschiedene Ergebnistypen zurückgeben - ein ViewResult, ein RedirectToActionResult usw. ActionResult enthält alle Daten, die von der View oder der neuen Action, die das Ergebnis von ist, benötigt werden die aktuelle Controller-Aktion.
Da es sich um die Basisklasse handelt, können Sie alle ActionResult-Unterklassen wie ViewResult oder JsonResult zurückgeben. Normalerweise gebe ich ViewResult als Standard zurück, überschreibe dieses Verhalten jedoch, wenn ich mit Ajax befasse, ein JsonResult-Objekt zurückzugeben.
Dies ermöglicht mir, Ajax als eine progressive Erweiterung hinzuzufügen und die Anwendung ohne JavaScript und ohne die Notwendigkeit für separate Controller-Aktionen zu halten.
Rückgabe eines ActionResult, anstatt "nur das zu tun, was das ActionResult macht" (dh direkt Response.Redirect zu verwenden oder einen View über den Response OutputStream direkt zu rendern) gibt Ihnen einen wirklich schönen Vorteil: Unit Testing ist wirklich einfach vor allem, weil Sie normalerweise keinen Webserver benötigen, um MVC Projects zu testen.
Nachtrag: Als Beispiel für eine Umleitung:
Wenn Sie das tun
return Redirect(newUrl);
in Ihrem Controller, Ihr Testgerät kann jetzt
- Stellen Sie sicher, dass der Rückgabewert vom Typ "RedirectResult"
- Sehen Sie sich die URL an, zu der re weitergeleitet wird sult.Url nach dem Gießen es
- Alle RedirectResult ohne IIS spinnen zu müssen oder zu versuchen, „Clevery“ Intercept des Response.Redirect Anruf
- Am Ende des Tages, RedirectResult ruft Response.Redirect darin ExecuteResult Funktion ist, aber der Controller Unit Test sitzt vor diesem
Nachtrag 2: Und während ich darauf bin, hier ist ein Beispiel für eine benutzerdefinierte Action:
http://www.stum.de/2008/10/22/permanentredirectresult/
Dies ist nur um zu zeigen, dass sie nicht "Black Magic" sind. Sie sind eigentlich ziemlich einfach: Ihr Controller gibt ein Aktionsergebnis zurück, und die MVC-Laufzeit ruft schließlich die ExecuteResult-Funktion auf und übergibt einen ControllerContext, mit dem Ihr ActionResult interagieren kann. Der springende Punkt ist wieder, die Teile von M-V-C zu trennen, Code wiederverwendbar zu machen und Einheitentests zu vereinfachen, oder kurz: um ein sehr sauberes Framework zu geben.
ok also statt Response.redirect, was soll ich umleiten? Verwenden von redirectToAction? Was passiert, wenn die Weiterleitung auf eine Seite erfolgt, die keine Aktion ausführt? (Sagen Sie eine .html Seite) –
Wie wäre es mit "Return Redirect (newUrl)"? Das gibt ein RedirectResult zurück, und result.Url enthält die URL, an die umgeleitet wird. Intern ruft Redirect.Result den Standard Response.Redirect auf, aber für Unit-Tests ist es viel einfacher. –
Der Antwort wurde ein komplizierteres Beispiel hinzugefügt. –