Wann verwendet JsonResult
über ActionResult
ich in der Regel konkrete Ergebnisse liefern (zB JsonResult
, ViewResult
), und es sind meine Profis:
Es gibt einige Links, wo die Menschen diesen Ansatz unterstützen:
Es ist ein Zitat von Pro ASP.NET MVC 3 Framework:
Hinweis Beachten Sie, dass der Rückgabetyp für die Aktionsmethode in der -Liste lautet. Die Methode würde genauso kompilieren und funktionieren , wenn wir den allgemeineren ActionResult
Typ angegeben hätten. In der Tat, einige MVC Programmierer definieren das Ergebnis jeder Aktionsmethode als ActionResult
, auch wenn sie wissen, dass es immer einen mehr spezifischen Typ zurückgeben wird. Wir waren besonders fleißig in dieser Praxis in die folgenden Beispiele, um klar zu machen, wie Sie jedes Ergebnis Art verwenden können, aber wir neigen dazu, in realen Projekten entspannter zu sein.
würde ich ActionResult
über Beton eine nur verwenden, wenn eine Aktion verschiedene Arten von Ergebnissen zurückgeben sollte. Aber es ist nicht diese allgemeine Situation.
Ich möchte auch hinzufügen, dass ActionResult
eine abstrakte Klasse ist, so dass Sie nicht einfach eine Instanz dieses Typs erstellen und zurückgeben können. JsonResult
ist konkret, so dass Sie seine Instanz erstellen und von einer Aktionsmethode zurückkehren können. There are many other types that derived from ActionResult
und im Grunde alle von ihnen sind used to override ExecuteResult
method.
public abstract class ActionResult
{
public abstract void ExecuteResult(ControllerContext context);
}
Diese Methode wird von ControllerActionInvoker
aufgerufen und implementiert Datenlogik zum Schreiben response
Objekt.
ControllerActionInvoker
weiß nichts über konkrete Ergebnisse, so dass es kein Ergebnis verarbeiten kann, die von ActionResult
abgeleitet und implementiert ExecuteResult
.
In beiden Fällen geben Sie in Ihrem Beispiel eine Instanz des Typs JsonResult
zurück, und Json(model)
ist einfach eine Factory-Methode, die eine Instanz von JsonResult
erstellt.
Es gibt noch eine SO Frage Is it better to have a method's datatype be as specific as possible or more general? wo Best Practices für Methodenparameter und Rückgabewerte diskutiert werden.
Die allgemeine Idee ist als abstrakten Typen bereitstellt Parameter, so dass Ihre Methode breitere Palette von Parametern verarbeiten kann; Zurückgeben von Beton genug Typen, so dass Ihre Kunden nicht umwandeln oder konvertieren müssen.