Qual é a melhor maneira de retornar XML da ação de um controlador no ASP.NET MVC? Existe uma boa maneira de retornar JSON, mas não para XML. Eu realmente preciso rotear o XML por meio de um modo de exibição ou devo seguir a maneira não recomendada de Response.Write-ing?
asp.net
.net
xml
asp.net-mvc
Ken Randall
fonte
fonte
XmlSerialiser
anotações de membro e uso podem ser difíceis de manter. Desde que Luke postou essa resposta (cerca de quatro anos atrás), o Linq to XML se provou um substituto mais elegante e poderoso para os cenários mais comuns. Confira minha resposta para um exemplo de como fazer isso.fonte
application/xml
tipo MIME.Se você estiver construindo o XML usando a excelente estrutura Linq para XML, essa abordagem será útil.
Eu crio um
XDocument
no método de ação.Esse costume reutilizável
ActionResult
serializa o XML para você.Você pode especificar um tipo MIME (como
application/rss+xml
) e se a saída deve ser recuada, se necessário. Ambas as propriedades possuem padrões sensíveis.Se você precisar de uma codificação diferente de UTF8, é simples adicionar uma propriedade para isso também.
fonte
application/octet-stream
forçar o download. Não sei qual tipo MIME inicia o Excel, mas você deve encontrá-lo online com bastante facilidade.Se você estiver interessado apenas em retornar o xml através de uma solicitação e tiver seu "chunk" em xml, basta fazer o seguinte (como uma ação no seu controlador):
fonte
Existe um XmlResult (e muito mais) no MVC Contrib. Dê uma olhada em http://www.codeplex.com/MVCContrib
fonte
Eu tive que fazer isso recentemente para um projeto Sitecore que usa um método para criar um XmlDocument a partir de um Item Sitecore e seus filhos e o retorna do controlador ActionResult como um arquivo. Minha solução:
fonte
Finalmente consegui esse trabalho e pensei em documentar como aqui, na esperança de salvar a dor dos outros.
Meio Ambiente
Navegadores da Web suportados
Minha tarefa foi clicar no botão da interface do usuário, chamar um método no meu Controller (com alguns parâmetros) e depois retornar um XML do MS-Excel por meio de uma transformação xslt. O XML retornado do MS-Excel faria o navegador abrir a caixa de diálogo Abrir / Salvar. Isso teve que funcionar em todos os navegadores (listados acima).
No começo, tentei com o Ajax e criar uma âncora dinâmica com o atributo "download" para o nome do arquivo, mas isso só funcionou para cerca de 3 dos 5 navegadores (FF, Chrome, Opera) e não para o IE ou o Safari. E houve problemas ao tentar disparar programaticamente o evento Click da âncora para causar o "download" real.
O que acabei fazendo foi usar um IFRAME "invisível" e funcionou para todos os 5 navegadores!
Então, aqui está o que eu criei: [por favor, note que eu não sou um guru de html / javascript e incluí apenas o código relevante]
HTML (trecho de bits relevantes)
JAVASCRIPT
C # SERVER-SIDE (trecho de código) @Drew criou um ActionResult personalizado chamado XmlActionResult que eu modifiquei para o meu propósito.
Retornar XML da ação de um controlador como ActionResult?
Meu método Controller (retorna ActionResult)
cria uma instância do XmlActionResult modificado e o retorna
Resultado XmlActionResult = novo XmlActionResult (excelXML, "application / vnd.ms-excel"); versão da string = DateTime.Now.ToString ("dd_MMM_yyyy_hhmmsstt"); string fileMask = "LabelExport_ {0} .xml";
result.DownloadFilename = string.Format (fileMask, versão); resultado de retorno;
A principal modificação na classe XmlActionResult que @Drew criou.
Era basicamente isso. Espero que ajude os outros.
fonte
Uma opção simples que permitirá que você use fluxos e tudo o que é
return File(stream, "text/xml");
.fonte
Aqui está uma maneira simples de fazer isso:
fonte
ms
diretamente, em vez de copiá-lo para um novo? Ambos os objetos terão a mesma vida útil.ms.Position=0
e você pode retornar o fluxo de memória original. Então você podereturn new FileStreamResult(ms,"text/xml");
Uma pequena variação da resposta de Drew Noakes que usa o método Save () do XDocument.
fonte