Was ist der beste Weg, um XML von der Aktion eines Controllers in ASP.NET MVC zurückzugeben? Es gibt eine gute Möglichkeit, JSON zurückzugeben, jedoch nicht für XML. Muss ich das XML wirklich durch eine Ansicht routen oder sollte ich die nicht bewährte Methode für die Antwort ausführen.
asp.net
.net
xml
asp.net-mvc
Ken Randall
quelle
quelle
XmlSerialiser
und Elementanmerkungen kann schwierig zu pflegen sein. Seit Luke diese Antwort veröffentlicht hat (vor ungefähr vier Jahren), hat sich Linq to XML als eleganter und leistungsfähigerer Ersatz für die meisten gängigen Szenarien erwiesen. In meiner Antwort finden Sie ein Beispiel dafür.quelle
application/xml
stattdessen den Mimetyp verwenden.Wenn Sie das XML mit dem hervorragenden Linq-to-XML-Framework erstellen, ist dieser Ansatz hilfreich.
Ich erstelle eine
XDocument
in der Aktion Methode.Diese wiederverwendbare, benutzerdefinierte
ActionResult
Serialisierung des XML für Sie.Sie können einen MIME-Typ (z. B.
application/rss+xml
) angeben und festlegen, ob die Ausgabe bei Bedarf eingerückt werden soll. Beide Eigenschaften haben sinnvolle Standardeinstellungen.Wenn Sie eine andere Codierung als UTF8 benötigen, können Sie auch dafür einfach eine Eigenschaft hinzufügen.
quelle
application/octet-stream
, um das Herunterladen zu erzwingen. Ich weiß nicht, welcher MIME-Typ Excel startet, aber Sie sollten ihn online leicht finden können.Wenn Sie nur daran interessiert sind, XML über eine Anfrage zurückzugeben, und Sie Ihren XML-Block haben, können Sie dies einfach tun (als Aktion in Ihrem Controller):
quelle
In MVC Contrib gibt es ein XmlResult (und vieles mehr). Schauen Sie sich http://www.codeplex.com/MVCContrib an
quelle
Ich musste dies kürzlich für ein Sitecore-Projekt tun, das eine Methode verwendet, um ein XmlDocument aus einem Sitecore-Element und seinen untergeordneten Elementen zu erstellen und es vom Controller ActionResult als Datei zurückzugeben. Meine Lösung:
quelle
Schaffe es endlich, diese Arbeit zu bekommen und dachte, ich würde dokumentieren, wie hier in der Hoffnung, anderen den Schmerz zu ersparen.
Umgebung
Unterstützte Webbrowser
Meine Aufgabe bestand darin, auf eine UI-Schaltfläche zu klicken, eine Methode auf meinem Controller aufzurufen (mit einigen Parametern) und dann ein MS-Excel-XML über eine xslt-Transformation zurückzugeben. Das zurückgegebene MS-Excel-XML würde dann dazu führen, dass der Browser das Dialogfeld Öffnen / Speichern öffnet. Dies musste in allen Browsern (oben aufgeführt) funktionieren.
Zuerst habe ich mit Ajax versucht, einen dynamischen Anker mit dem Attribut "Download" für den Dateinamen zu erstellen, aber das funktionierte nur für etwa 3 der 5 Browser (FF, Chrome, Opera) und nicht für IE oder Safari. Und es gab Probleme beim Versuch, das Click-Ereignis des Ankers programmgesteuert auszulösen, um den tatsächlichen "Download" zu verursachen.
Am Ende habe ich einen "unsichtbaren" IFRAME verwendet, der für alle 5 Browser funktioniert hat!
Also hier ist, was ich mir ausgedacht habe: [Bitte beachten Sie, dass ich keineswegs ein HTML / Javascript-Guru bin und nur den relevanten Code eingefügt habe]
HTML (Ausschnitt relevanter Bits)
JAVASCRIPT
C # SERVER-SIDE (Code-Snippet) @Drew hat ein benutzerdefiniertes ActionResult namens XmlActionResult erstellt, das ich für meinen Zweck geändert habe.
XML von der Aktion eines Controllers als ActionResult zurückgeben?
Meine Controller-Methode (gibt ActionResult zurück)
Erstellt eine Instanz des geänderten XmlActionResult und gibt sie zurück
XmlActionResult-Ergebnis = neues XmlActionResult (excelXML, "application / vnd.ms-excel"); Zeichenfolge version = DateTime.Now.ToString ("dd_MMM_yyyy_hhmmsstt"); string fileMask = "LabelExport_ {0} .xml";
result.DownloadFilename = string.Format (fileMask, version); Ergebnis zurückgeben;
Die Hauptänderung an der XmlActionResult-Klasse, die @Drew erstellt hat.
Das war es im Grunde. Hoffe es hilft anderen.
quelle
Eine einfache Option, mit der Sie Streams und alles, was ist, verwenden können
return File(stream, "text/xml");
.quelle
Hier ist eine einfache Möglichkeit:
quelle
ms
direkt übergeben, anstatt es auf ein neues zu kopieren? Beide Objekte haben die gleiche Lebensdauer.ms.Position=0
und Sie können die Original - Memorystream zurück. Dann können Siereturn new FileStreamResult(ms,"text/xml");
Eine kleine Variation der Antwort von Drew Noakes , die die Methode Save () von XDocument verwenden.
quelle