Wann JsonResult über ActionResult zu verwenden ist
Ich habe nicht in der Lage zu finden, eine konkrete Antwort auf diese Frage. Ich habe eingesehen Beiträge und die anschließenden Beiträge von diese Frage und anderswo, aber alle habe ich Sie wirklich kommen aus der Lektüre ist, dass JsonResult hat eine fest programmierte content-Typ und es ist wirklich nicht irgendwelche performance-Gewinne.
Wenn beide Ergebnisse können in Json zurückgeben, warum würden Sie müssen zu verwenden JsonResult über ActionResult.
public ActionResult()
{
return Json(foo)
}
public JsonResult()
{
return Json(bar)
}
Kann mir jemand erklären, ein Szenario, in dem ActionResult kann einfach nicht den job zu erledigen und JsonResult muss verwendet werden. Wenn nicht, warum JsonResult existieren in den ersten Platz.
InformationsquelleAutor der Frage CSharper | 2014-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich in der Regel zurück, konkrete Ergebnisse (z.B.
JsonResult
,ViewResult
) und da sind meine pros:PartialViewResult
undViewResult
als Ergebnis geben Sie genau.Gibt es einige links, wo Menschen, die diesen Ansatz unterstützen:
Es ist ein Zitat von Pro ASP.NET MVC 3 Framework:
Würde ich
ActionResult
über das konkrete nur, wenn eine Aktion zurückkehren sollte, verschiedene Arten von Ergebnissen. Aber es ist nicht, die Allgemeine situation.Ich möchte auch hinzufügen, dass
ActionResult
ist eine abstrakte Klasse, so kann man nicht einfach erstellen Sie eine Instanz dieses Typs und gibt es zurück.JsonResult
ist Beton, so können Sie Ihre Instanz und der Rückkehr von einer action-Methode. Es gibt viele andere Typen, abgeleitet vonActionResult
und im Grunde alle von Ihnen sind überschreiben Sie dieExecuteResult
Methode.Diese Methode wird aufgerufen, durch
ControllerActionInvoker
und eine Logik implementiert, die Daten schreiben zuresponse
Objekt.ControllerActionInvoker
weiß nicht, über konkrete Ergebnisse, so dass es verarbeiten kann jedes Ergebnis abgeleitet ist, vonActionResult
und implementiertExecuteResult
.In beiden Fällen liefert eine Instanz der
JsonResult
geben Sie in Ihrem Beispiel undJson(model)
es ist einfach eine Factory-Methode erzeugt eine Instanz derJsonResult
.Es ist ein weiterer SO Frage Ist es besser, eine Methode datatype so spezifisch wie möglich, oder mehr allgemein?, wo best practices für die Methodenparameter und return-Werte werden diskutiert.
Die Allgemeine Idee ist die Bereitstellung von abstrakten Typen als Parameter so, dass Ihre Methode behandeln können breitere Palette von parameter; Rückkehr konkret genug Typen, so dass Ihre Kunden brauchen nicht zu Gießen oder zu konvertieren.
InformationsquelleAutor der Antwort Ilya Palkin
Haben Sie möglicherweise bemerkt, dass die Namen aller die gemeinsamen Rückkehr-Typen in einem MVC-controller-Ende mit "Ergebnis", und mehr als oft nicht, die meisten Aktionen Rückkehr eine ActionResult. Wenn man sich die Dokumentation, können Sie sehen, dass mehrere, mehr specalized Ergebnis-Typen, Erben von der abstrakten Klasse ActionResult. Weil dieser, können Sie jetzt wieder ein ActionResult in alle Ihre Handlungen, und sogar wieder verschiedene Arten. Beispiel:
All dies macht es leichter andere Inhalte zurück, basierend auf dem Wunsch. Also, warum würden Sie verwenden, JsonResult über ActionResult? Vielleicht damit es keine Missverständnisse gibt, und Sie in der Tat nur können JSON zurückgeben, vielleicht für die Lesbarkeit oder andere persönliche Präferenz.
InformationsquelleAutor der Antwort Tobias
Es ist nur die Einhaltung einfachen Polymorphismus Prinzip.
Durch die Definition der Signatur der Methode als Rückgabe eine abstrakte
ActionResult
was ist der Basis-Typ fürJsonResult
,ViewResult
,ContentResult
(und andere) haben Sie die Möglichkeit der RÜCKFÜHRUNG der oben genannten Arten, indem die Umsetzung der Aktion entscheiden, welcheActionResult
zurück.Beispiel:
Ist es tatsächlich eine gängige Praxis in der OOP zu definieren, der zurückgegeben Art der Methode als Abstrakt wie möglich. Finden Sie es in .NET BCL-als auch die
IEnumerable<>
Verwendung in Linq zum Beispiel:Den
Where()
Methode ist deklariert als eine RückkehrIEnumerable<T>
so, dass Sie rufen Sie die Methode auf jede Art, die der Umsetzung derIEnumerable<T>
- interface, sei es einArray
,List
,HashSet
oderDictionary
.InformationsquelleAutor der Antwort haim770
Eigentlich gibt es keine Gründe für die Verwendung
JsonResult
als return-Typ von Action-Methoden.In diesem Fall ist es besser, um abstrakte Klasse
ActionResult
zu Folgen polymorphe Prinzipien.Durch den Aufruf
return Json(value)
Sie tatsächlich den Aufruf von helper-Methode der Controller-Klasse, die wie folgt aussieht:Als wir sehen können -
Json
Helfer-Methode instanziierenJsonResult
sowieso.InformationsquelleAutor der Antwort Dmitry Zaets