Apa cara terbaik untuk mengembalikan XML dari aksi pengontrol di ASP.NET MVC? Ada cara yang bagus untuk mengembalikan JSON, tetapi tidak untuk XML. Apakah saya benar-benar perlu mengarahkan XML melalui Tampilan, atau haruskah saya melakukan cara respons yang tidak terbaik? Menulisnya?
asp.net
.net
xml
asp.net-mvc
Ken Randall
sumber
sumber
XmlSerialiser
dan anotasi anggota mungkin sulit dipertahankan. Sejak Luke memposting jawaban ini (sekitar empat tahun lalu), Linq to XML telah membuktikan dirinya sebagai pengganti yang lebih elegan dan kuat untuk skenario paling umum. Lihatlah jawaban saya untuk contoh bagaimana melakukan ini.sumber
application/xml
mimetype sebagai gantinya.Jika Anda sedang membangun XML menggunakan kerangka kerja Linq-to-XML yang sangat baik, maka pendekatan ini akan sangat membantu.
Saya membuat
XDocument
metode aksi.Ini dapat digunakan kembali, kustom membuat
ActionResult
serialisasi XML untuk Anda.Anda dapat menentukan tipe MIME (seperti
application/rss+xml
) dan apakah output harus diindentasi jika perlu. Kedua properti memiliki default yang masuk akal.Jika Anda memerlukan penyandian selain UTF8, maka mudah untuk menambahkan properti untuk itu juga.
sumber
application/octet-stream
memaksanya untuk mengunduh. Saya tidak tahu tipe MIME apa yang meluncurkan Excel, tetapi Anda harus dapat menemukannya secara online dengan cukup mudah.Jika Anda hanya tertarik untuk mengembalikan xml melalui permintaan, dan Anda memiliki xml "chunk", Anda bisa melakukannya (sebagai tindakan di controller Anda):
sumber
Ada XmlResult (dan banyak lagi) di MVC Contrib. Lihatlah http://www.codeplex.com/MVCContrib
sumber
Saya harus melakukan ini baru-baru ini untuk proyek Sitecore yang menggunakan metode untuk membuat XmlDocument dari Item Sitecore dan anak-anaknya dan mengembalikannya dari controller ActionResult sebagai File. Solusi saya:
sumber
Akhirnya berhasil mendapatkan pekerjaan ini dan berpikir saya akan mendokumentasikan bagaimana di sini dengan harapan menyelamatkan orang lain dari rasa sakit.
Lingkungan Hidup
Browser Web yang didukung
Tugas saya adalah klik tombol ui, panggil metode pada Kontroler saya (dengan beberapa params) dan kemudian kembalikan XML MS-Excel melalui transformasi xslt. MS-Excel XML yang dikembalikan kemudian akan menyebabkan browser popup dialog Open / Save. Ini harus berfungsi di semua browser (tercantum di atas).
Pada awalnya saya mencoba dengan Ajax dan membuat Anchor dinamis dengan atribut "unduh" untuk nama file, tetapi itu hanya bekerja untuk sekitar 3 dari 5 browser (FF, Chrome, Opera) dan bukan untuk IE atau Safari. Dan ada masalah dengan mencoba memrogram acara Click jangkar secara terprogram untuk menyebabkan "unduhan" yang sebenarnya.
Apa yang akhirnya saya lakukan adalah menggunakan IFRAME "tidak terlihat" dan bekerja untuk semua 5 browser!
Jadi inilah yang saya kemukakan: [harap dicatat bahwa saya tidak berarti guru html / javascript dan hanya menyertakan kode yang relevan]
HTML (potongan bit yang relevan)
JAVASCRIPT
C # SERVER-SIDE (potongan kode) @Drew membuat ActionResult kustom yang disebut XmlActionResult yang saya modifikasi untuk tujuan saya.
Kembalikan XML dari tindakan pengontrol sebagai ActionResult?
Metode Pengontrol Saya (mengembalikan ActionResult)
menciptakan instance XmlActionResult yang dimodifikasi dan mengembalikannya
Hasil XmlActionResult = XmlActionResult baru (excelXML, "application / vnd.ms-excel"); versi string = DateTime.Now.ToString ("dd_MMM_yyyy_hhmmsstt"); string fileMask = "LabelExport_ {0} .xml";
result.DownloadFilename = string.Format (fileMask, versi); hasil pengembalian;
Modifikasi utama ke kelas XmlActionResult yang dibuat @Drew.
Itu pada dasarnya itu. Semoga ini bisa membantu orang lain.
sumber
Opsi sederhana yang memungkinkan Anda menggunakan stream dan sebagainya
return File(stream, "text/xml");
.sumber
Inilah cara sederhana untuk melakukannya:
sumber
ms
langsung saja lulus , alih-alih menyalinnya ke yang baru? Kedua benda akan memiliki umur yang sama.ms.Position=0
dan Anda dapat mengembalikan MemoryStream asli. Maka Anda bisareturn new FileStreamResult(ms,"text/xml");
Variasi kecil jawaban dari Drew Noakes yang menggunakan metode Save () dari XDocument.
sumber