Quelle est la meilleure façon de renvoyer du XML à partir de l'action d'un contrôleur dans ASP.NET MVC? Il existe une bonne façon de renvoyer JSON, mais pas pour XML. Ai-je vraiment besoin d'acheminer le XML via une vue, ou devrais-je utiliser la méthode de réponse qui n'est pas la meilleure pratique.
asp.net
.net
xml
asp.net-mvc
Ken Randall
la source
la source
XmlSerialiser
annotations et des membres peut être difficile à gérer. Depuis que Luke a publié cette réponse (il y a environ quatre ans), Linq to XML s'est avéré être un remplacement plus élégant et plus puissant pour la plupart des scénarios courants. Consultez ma réponse pour un exemple de la façon de procéder.la source
application/xml
type MIME à la place.Si vous construisez le XML à l'aide de l'excellent framework Linq-to-XML, cette approche sera utile.
Je crée une
XDocument
méthode dans l'action.Cette personnalisation réutilisable
ActionResult
sérialise le XML pour vous.Vous pouvez spécifier un type MIME (tel que
application/rss+xml
) et si la sortie doit être indentée si nécessaire. Les deux propriétés ont des valeurs par défaut sensibles.Si vous avez besoin d'un encodage autre que UTF8, alors il est simple d'ajouter une propriété pour cela aussi.
la source
application/octet-stream
pour forcer le téléchargement. Je ne sais pas quel type MIME lance Excel, mais vous devriez pouvoir le trouver en ligne assez facilement.Si vous souhaitez uniquement renvoyer du xml via une requête et que vous avez votre "bloc" xml, vous pouvez simplement faire (en tant qu'action dans votre contrôleur):
la source
Il existe un XmlResult (et bien plus encore) dans MVC Contrib. Jetez un œil à http://www.codeplex.com/MVCContrib
la source
J'ai dû le faire récemment pour un projet Sitecore qui utilise une méthode pour créer un XmlDocument à partir d'un élément Sitecore et de ses enfants et le renvoie du contrôleur ActionResult sous forme de fichier. Ma solution:
la source
Enfin réussir à obtenir ce travail et j'ai pensé que je documenterais comment ici dans l'espoir de sauver les autres de la douleur.
Environnement
Navigateurs Web pris en charge
Ma tâche consistait à cliquer sur un bouton d'interface utilisateur, à appeler une méthode sur mon contrôleur (avec quelques paramètres), puis à lui faire renvoyer un XML MS-Excel via une transformation xslt. Le XML MS-Excel renvoyé amènerait alors le navigateur à faire apparaître la boîte de dialogue Ouvrir / Enregistrer. Cela devait fonctionner dans tous les navigateurs (listés ci-dessus).
Au début, j'ai essayé avec Ajax et de créer une ancre dynamique avec l'attribut "download" pour le nom de fichier, mais cela ne fonctionnait que pour environ 3 des 5 navigateurs (FF, Chrome, Opera) et non pour IE ou Safari. Et il y avait des problèmes avec la tentative de déclencher par programme l'événement Click de l'ancre pour provoquer le "téléchargement" réel.
Ce que j'ai fini par faire était d'utiliser un IFRAME "invisible" et cela a fonctionné pour les 5 navigateurs!
Voici donc ce que j'ai proposé: [veuillez noter que je ne suis en aucun cas un gourou html / javascript et que je n'ai inclus que le code pertinent]
HTML (extrait de bits pertinents)
JAVASCRIPT
C # SERVER-SIDE (extrait de code) @Drew a créé un ActionResult personnalisé appelé XmlActionResult que j'ai modifié à mes fins.
Renvoyer du XML à partir de l'action d'un contrôleur en tant qu'ActionResult?
Ma méthode Controller (retourne ActionResult)
crée une instance du XmlActionResult modifié et la renvoie
XmlActionResult result = new XmlActionResult (excelXML, "application / vnd.ms-excel"); version de la chaîne = DateTime.Now.ToString ("jj_MMM_aaaa_hhmmsstt"); string fileMask = "LabelExport_ {0} .xml";
result.DownloadFilename = string.Format (fileMask, version); résultat de retour;
La principale modification de la classe XmlActionResult créée par @Drew.
C'était essentiellement ça. J'espère que cela aide les autres.
la source
Une option simple qui vous permettra d'utiliser les flux et tout ce qui est
return File(stream, "text/xml");
.la source
Voici une façon simple de le faire:
la source
ms
directement, au lieu de le copier dans un nouveau? Les deux objets auront la même durée de vie.ms.Position=0
et vous pouvez renvoyer le flux de mémoire d'origine. Alors vous pouvezreturn new FileStreamResult(ms,"text/xml");
Une petite variation de la réponse de Drew Noakes qui utilise la méthode Save () de XDocument.
la source