2009-06-09 10 views
36

Quiero devolver una Vista() de una acción, y la respuesta resultante debe tener un tipo de contenido de texto/xml en lugar del texto predeterminado/html.ASP.NET MVC y texto/tipo de contenido xml

He intentado lo siguiente, sin éxito:

Response.ContentType = "text/xml"; 
return View(); 

Sé que se puede especificar el tipo de contenido mediante la devolución de ContentResult, pero eso no hace que mi punto de vista.

Espero que no necesite renderizar la vista en una cadena y luego usar return Content(), por lo que probablemente esté pasando por alto de alguna manera fácil.

+1

Me sorprende que nadie vio esto como un duplicado: http://stackoverflow.com/questions/134905/what-is-the-best-way-to-return- xml-from-a-controllers-action-in-asp-net-mvc –

+0

@TomasLycken, puede ser porque legenden y yo estamos poniendo el XML en la Vista y simplemente deseamos establecer el ContentType de la Vista, no construir XML en el Controlador luego pasarlo a la Vista. Estos son definitivamente dos métodos diferentes. –

+1

Otra nota para todos es que esta cadena de tipo de contenido se puede referenciar como 'System.Net.Mime.MediaTypeNames.Text.Xml'. – jamiebarrow

Respuesta

54
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" 
    ContentType="text/xml" %> 
+0

¡Gracias, eres un genio! –

+0

hermoso, no sabía que podría establecer ContentType en la página. Esto es genial: P –

+2

y si tiene una vista razuradora, entonces debería ser '@ {Response.ContentType = System.Net.Mime.MediaTypeNames.Text.Xml; } ' – avs099

0

¿Ha intentado establecer el response.content desde el método de representación previa de la vista en la página codebehind? eso es obviamente asumiendo que estás usando el motor de vista de formularios web

+0

Mi vista no tiene código subyacente. – andreialecu

+0

así que agregue uno ;-). –

+16

: -/No agregue uno – Charlino

38

Debes renderizar la cadena. Para volver text/xml haga lo siguiente:

return new ContentResult { 
    ContentType = "text/xml", 
    Content = UTF8.GetString(yourXmlString), 
    ContentEncoding = System.Text.Encoding.UTF8 
}; 
+0

Bueno, ya sabía sobre esto (especificado en la pregunta), pero quiero evitarlo. – andreialecu

+1

Funciona para mí porque quiero devolver una respuesta XML sin la necesidad de una página de vista aspx. – stephen

1

Se necesita una visión de que no anula las cosas y generar HTML, incluyendo su propio tipo de contexto.

Una vista personalizada puede representar directamente a Response.Write (ver JsonResult en Reflector para una clase que sea muy similar a la que necesitaría).

Para representar XML sin una cadena intermedia, guarde su XML en XmlWriter creado en Response.Output.

6

El control de usuarios (ASCX) no acepta ContentType = "text/xml".

Solución:

public ActionResult xxx() 
    { 
    Response.ContentType = "text/xml"; 
    return View("xxx.ascx"); 
    }