¿Cuál es la mejor manera de devolver XML de la acción de un controlador en ASP.NET MVC? Hay una buena manera de devolver JSON, pero no para XML. ¿Realmente necesito enrutar el XML a través de una vista, o debo hacer la forma de respuesta que no es la mejor práctica.
asp.net
.net
xml
asp.net-mvc
Ken Randall
fuente
fuente
XmlSerialiser
y las anotaciones de miembros pueden ser difíciles de mantener. Desde que Luke publicó esta respuesta (hace unos cuatro años), Linq to XML ha demostrado ser un reemplazo más elegante y poderoso para los escenarios más comunes. Mira mi respuesta para ver un ejemplo de cómo hacer esto.fuente
application/xml
MIME en su lugar.Si está creando el XML utilizando el excelente marco de trabajo de Linq a XML, este enfoque será útil.
Creo un
XDocument
en el método de acción.Esta serie reutilizable y personalizada
ActionResult
serializa el XML por usted.Puede especificar un tipo MIME (como
application/rss+xml
) y si la salida debe sangrarse si es necesario. Ambas propiedades tienen valores predeterminados razonables.Si necesita una codificación que no sea UTF8, entonces también es simple agregar una propiedad para eso.
fuente
application/octet-stream
forzarlo a descargar. No sé qué tipo MIME lanza Excel, pero debería poder encontrarlo en línea con la suficiente facilidad.Si solo está interesado en devolver xml a través de una solicitud, y tiene su "fragmento" xml, simplemente puede hacer (como una acción en su controlador):
fuente
Hay un XmlResult (y mucho más) en MVC Contrib. Echa un vistazo a http://www.codeplex.com/MVCContrib
fuente
Recientemente tuve que hacer esto para un proyecto de Sitecore que utiliza un método para crear un documento Xml a partir de un elemento de Sitecore y sus elementos secundarios y lo devuelve desde el controlador ActionResult como un archivo. Mi solución:
fuente
Finalmente logré conseguir este trabajo y pensé que documentaría cómo hacerlo aquí con la esperanza de salvar a otros del dolor.
Ambiente
Navegadores web compatibles
Mi tarea fue hacer clic en el botón ui, llamar a un método en mi controlador (con algunos parámetros) y luego hacer que devuelva un XML de MS-Excel a través de una transformación xslt. El XML de MS-Excel devuelto provocará que el navegador muestre el cuadro de diálogo Abrir / Guardar. Esto tenía que funcionar en todos los navegadores (enumerados anteriormente).
Al principio intenté con Ajax y crear un Anchor dinámico con el atributo "descargar" para el nombre de archivo, pero eso solo funcionó para aproximadamente 3 de los 5 navegadores (FF, Chrome, Opera) y no para IE o Safari. Y hubo problemas al intentar disparar mediante programación el evento Click del ancla para provocar la "descarga" real.
¡Lo que terminé haciendo fue usar un IFRAME "invisible" y funcionó para los 5 navegadores!
Así que esto es lo que se me ocurrió: [tenga en cuenta que de ninguna manera soy un gurú html / javascript y solo he incluido el código relevante]
HTML (fragmento de bits relevantes)
JAVASCRIPT
C # SERVER-SIDE (fragmento de código) @Drew creó un ActionResult personalizado llamado XmlActionResult que modifiqué para mi propósito.
¿Devolver XML de la acción de un controlador como un ActionResult?
Método My Controller (devuelve ActionResult)
crea una instancia del XmlActionResult modificado y lo devuelve
Resultado XmlActionResult = nuevo XmlActionResult (excelXML, "application / vnd.ms-excel"); versión de cadena = DateTime.Now.ToString ("dd_MMM_yyyy_hhmmsstt"); string fileMask = "LabelExport_ {0} .xml";
result.DownloadFilename = string.Format (fileMask, versión); resultado de retorno;
La modificación principal a la clase XmlActionResult que @Drew creó.
Eso fue básicamente todo. Espero que ayude a los demás.
fuente
Una opción simple que le permitirá usar transmisiones y todo lo que es
return File(stream, "text/xml");
.fuente
Aquí hay una manera simple de hacerlo:
fuente
ms
directamente, en lugar de copiarlo a uno nuevo? Ambos objetos tendrán la misma vida útil.ms.Position=0
y puede devolver el flujo de memoria original. Entonces puedesreturn new FileStreamResult(ms,"text/xml");
Una pequeña variación de la respuesta de Drew Noakes que usa el método Save () de XDocument.
fuente