2009-08-26 4 views
0

Rails hat eine nette Redewendung, die es Ihnen einfach macht, eine ordnungsgemäß formatierte Daten (JSON, XML, nur die Daten) auf der Grundlage von einzelnen Aktion Methode zurückzugeben das Format, das von dem Client angegeben (oder auch aus der Anfrage abgeleitet. Es sieht ungefähr so ​​aus ...Was ist der beste Weg, um die Rückgabe mehrerer Formate in ASP.NET MVC

respond_to do |format| 
    format.html #edit.html.erb 
    format.json {render :text=> <your json here>), :layout=> false} 
    format.xml ... 

end 

Was die bevorzugten Art und Weise ist dies in ASP.NET MVC zu tun? im Idealfall würde Ich mag die Framework, um auf die gleiche Weise wie Rails zu arbeiten (z. B. in der Lage sein, die ViewData richtig formatiert für das vom Client angegebene oder von der Anfrage selbst abgeleitete Format zurückzugeben)

Mit Rails können Sie auch Ansichten erstellen, die für jeden Typ spezifisch sind. Dadurch erhalten Sie die Möglichkeit, dieselben Daten im Wesentlichen an alle Ansichten zurückzugeben und sie korrekt formatieren zu lassen (also eine Ansicht, die xml erstellt, eine andere, die json erstellt) ein anderer, der HTML baut). Ist das mit ASP.NET MVC möglich? In der Tat scheint dieses Modell am besten mit dem Ziel zu bleiben, Bedenken imho zu trennen, da es den Controllern erlaubt, blickunabhängige Daten zurückzugeben, während die meisten Ansätze, die ich heute sehe (einschließlich der obigen Zeile "format.json ....: layout => false ") Führen Sie die JSON-Konvertierung innerhalb des Controllers durch und geben Sie diese Daten bei einer Anfrage für dieses Format direkt an den Client zurück.

Wie auch immer ... Vorschläge, Gedanken, Empfehlungen?

Dank

Antwort

2

In ASP.NET MVC, Controller-Aktionen Objekte im Allgemeinen zurück, die aus ActionResult ableiten, die dann von der Laufzeit aufgerufen wird, während die Strom-Antwort zu erzeugen.

Out-of-the-box Sie mehrere Klassen, die von ActionResult ableiten - ContentResult für Textergebnisse, ViewResult für Inhalte aus einer Sicht, JsonResult für eine Objekthierarchie in JSON Serialisierung, RedirectResult zum Umleiten, und so weiter.

Im Allgemeinen übergeben Sie das Modell an das Ergebnis und lassen es entscheiden, wie das Ergebnis generiert wird, aber es muss nicht das gleiche Modell sein - ich kann bei Bedarf jedes Ergebnis an ein anderes Objekt übergeben.

Die konkrete Art des Ergebnisses durch eine Aktion zurückgegeben wird, ist nicht ‚in gebacken‘, um die Unterschrift der Aktion - Sie können in einem Format-Parametern auf Ihre Aktion leicht passieren, und es hat erzeugen und eine andere Action zurückkehrt entsprechend:

public ActionResult ListProducts(string format) 
{ 
    List<Product> products = ProductService.GetAllProducts(); 
    if (format == "JSON") 
    { 
     // eg., transform model for JSON consumption 
     List<JsonProduct> jsonProducts = ProductService.ToJSON(products); 
     return Json(jsonProducts); 
    } 
    else if (format == "XML") 
    { 
     return new XmlResult(products); 
    }

// default is to return HTML from view, which expects List<Product> for model 
    return View(products); 

}

anzumerken, dass die Verfahren und Json()View() werden in die Steuerung eingebaut und sind bequeme Methoden für JsonResult und ViewResult respec Rückkehr wirklich. XmlResult ist ein Beispiel für eine benutzerdefinierte ActionResult, die ein Objekt nimmt, es in XML serialisiert und dann das Ergebnis als XML-Stream zurückgibt.

Das Beispiel ist ein wenig erfunden, aber es zeigt, dass der Controller die gesamte Arbeit des Auswählens des Ergebnisses und des Konstruierens/Transformierens des Modells, das an dieses Ergebnis übergeben wird, koordiniert. Controller-Aktionen sollten dennoch leicht sein, sodass Sie die schweren Aufgaben an Services abladen, z. B. Laden des Modells aus der Business-Schicht oder Transformieren von Objekten in einem Modell in Objekte in einem anderen Modell, z. B. für JSON-Verbrauch.

+0

Das einzige Problem hier ist, dass es selten so einfach ist, nur Json (Ihr Modell) zurückzugeben.Normalerweise würde ich erwarten, dass Leute so etwas wie JQuery oder ExtJs in dem Client verwenden, der die JSON (oder XML) benötigt, um auf eine bestimmte Weise strukturiert zu sein. Also ... wo passiert diese Umstrukturierung? Wenn wir es in der Steuerung tun sollten ... wo/wie? Und wenn wir es dort tun ... verletzt das nicht die "Trennung von Sorgen"? Wenn wir es in der Ansicht tun ... wie modifizieren wir das Framework, um verständlich die richtige Ansicht basierend auf dem angeforderten Format auszuwählen? Danke. – wgpubs

+0

Ich stimme zu, die meiste Zeit benötigen Sie ein separates Modell für die Arbeit mit JSON. Ich sehe nicht, warum die Trennung von Bedenken verletzt wird - der Controller ist bestrebt, dem Modell das Modell zur Verfügung zu stellen, das auch beinhaltet, herauszufinden, welches Modell sein sollte und welche Ansicht diesem Modell gegeben werden sollte. Für den Controller ist dies völlig relevant. Es wäre definitiv ein Verstoß, wenn die Ansicht die Arbeit des Controllers machen würde. Ich habe meine Probe bearbeitet, um den Modellaufbau anzuzeigen. – Sam

+0

Ich denke, ich bin ein bisschen zerrissen, weil ja, der Controller sollte dafür verantwortlich sein, wie die Daten verpackt und an die Ansicht gesendet werden ... aber bedeutet das, dass es für solche verantwortlich sein sollte, wenn das bedeutet, die Daten in potenziell vielen Formaten basierend auf einem oder mehreren verwendeten clientseitigen Frameworks (zB ExtJs, Jquery, Mootools, etc ...)? Sie sehen, wir geben hier nicht nur eine Reihe von Daten zurück ... wir geben Daten für JQuery oder FOR ExtJs zurück. Das ist, wo die Trennung Sache ein bisschen mehr verdunkelt wird und auch Unit-Test-Controller ein bisschen haariger. – wgpubs

Verwandte Themen