2012-06-22 17 views
9

Me gustaría obtener alguna guía para devolver un documento XML de un controlador a una vista. En mi opinión, me gustaría recorrer el documento XML utilizando JQuery. Hay muchos ejemplos en línea que usan JQuery para este uso.En ASP.NET MVC, Cómo devolver un documento xml a una Vista

Tengo un controlador PortfolioList() a continuación, que en este momento simplemente devuelve la vista, pero me gustaría averiguar cómo DEVOLVER LA RESPUESTA XML. Notarás a continuación que estoy escribiendo la respuesta XML a un archivo local solo para propósitos de prueba ...

¿Necesito crear un modelo limpiamente para esto?

public ActionResult PortfolioList() 
    { 
     XmlDocument xmlResponse = new XmlDocument(); 
     XmlDocument xmlRequest = new XmlDocument(); 

     bool rzInitialized = nitializeRz(); 
     if (rzInitialized == false) 
     { 
      ViewBag.Message = "Rz Init has failed. Check if Rz is running"; 
      return View(); 
     } 
     bool rzConnected = ConnectToRz();  

     ViewBag.Message = "Here you may view a list of portfolios and exposures."; 

     // Build Portfolio Select request here ! 
     RequestBuilder rzRequest = new RequestBuilder(); 

     // REQUEST FOR PORTFOLIOS ! 
     string portfoliosRequest = rzRequest.PortfoliosRequest("Portfolios"); 
     string **portfoliosResponse** = RzClient.sendRequest(portfoliosRequest, false); 

     // DEBUG REQUESTS !! 
     if (Debugflag) 
     { 
      rzRequest.DebugOutput("portfolios", portfoliosRequest, portfoliosResponse); 
     } 
     DisconnectFromRz(); 

     return View("PortfolioList"); 
    } 
+0

Sí, debe crear modelos para todas sus vistas que contengan datos dinámicos. Siempre es más limpio de esa manera. – EkoostikMartin

Respuesta

10

Puede hacerlo de la siguiente manera.

public ActionResult PortfolioList() 
{ 
    //Your code 
    .... 
    return this.Content(yourXml, "text/xml"); 
} 
+0

Si hace esto, ¿cómo se ve la vista? – EkoostikMartin

+0

La vista de tiempo de diseño está vacía, pero la respuesta en tiempo de ejecución será yourXml – Kaf

+0

Eso no funcionará para el uso de OP: "En mi opinión, me gustaría recorrer el documento XML utilizando JQuery". – EkoostikMartin

1

Si vuelvo documento XML de acción del controlador es todo lo que sobre una mejor idea es la creación de un resultado de acción personalizada.

public class XmlDocumentResult: ContentResult 
{ 
    public XmlDocument XmlDocument { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (XmlDocument == null) 
     return; 

     Content = XmlDocument.InnerXml; 
     ContentType = "text/xml"; 
     base.ExecuteResult(context); 
    } 
} 

Ahora puede volver XML a partir de una acción como,

public XmlDocumentResult GetXml() 
{ 
    var xmlDoc = new XmlDocument(); 
    ... 

    return new XmlDocumentResult { XmlDocument = xmlDoc }; 
} 
+0

Mark, eso se ve muy interesante. He visto esta idea publicada en una publicación similar relacionada con xml, pero estaban discutiendo el MVCContrib en Codeplex (acción XmlResult). En cualquier caso, la publicación también contenía una anulación del método ExecuteResult(). Gracias, ya que voy a experimentar con esto pronto !!! :-) - Bob –

+0

InnerXml no tendrá todo el documento. Esto es incorrecto. –

0

Basado en el consejo de otro desarrollador, voy la ruta formato de datos JSON. Resulta que devolver un documento XML de un controlador asp.net a una Vista es una pesadilla COMPLETA (es decir, puedo devolver el documento XML en sí al navegador, pero no puedo entender cómo usar jQuery para procesar el xml nodos).

He seguido la ruta de deserializar el documento XML en el lado del servidor, y devolver un JsonResult a mi Vista (es decir, usando la rutina Ajax de JQuery para llamar a mi controlador).

ejemplo de código de serialización XML: http://msdn.microsoft.com/en-us/library/58a18dwa.aspx#Y0

0

me encontré con un ejemplo de código en línea jQuery que funciona para mí! El ejemplo de código analiza un documento XML de la siguiente manera (la url es http://www.switchonthecode.com/tutorials/xml-parsing-with-jquery):

<script type="text/javascript"> 

$(document).ready(function() { 
    $.ajax({ 
     type: "GET", 
     url: "/Xml/xml_test1.xml", 
     dataType: "xml", 
     success: parseXml, 
     error: function (error) { 
      alert("Some problem."); 
     } 
    }); 
}); 

function parseXml(xml) { 
    //find every Tutorial and print the author 
    $(xml).find("Tutorial").each(function() { 
     $("#output").append($(this).find("Title").text() + "<br/>"); 
     $(this).find("Category").each(function() { 
      $("#output").append($(this).text() + "<br />"); 
     }); 
     $("#output").append("<br/>"); 


    }); 
} 

Sin embargo, no entiendo algo como esto no funciona (sino simplemente vuelca toda la innerText de cada elemento único en mi página) ... perdón por las líneas comentadas:

//$.ajax({ 
// url: "/Portfolios/getPortfolios", 
// type: "POST", 
// dataType: "XML", 
// async: true, 
// success: function (data) { 
//  if (!data) 
//   alert("No xml data returned."); 
//  else { 
//   var $xml = $(data); 
//   $xml.find("portfolioSummary").each(function() { 
//    $('.XmlResp').text("DUDE!");   // text($(this).text()); 
//   }); 
//   //alert($xml.text()); 

//   $('.XmlResp').text("Wow are we getting somewhere ?!!!"); 
//   $('.XmlResp').replaceWith($xml.text()); 

//  } 
// }, 
// error: function (error) { 
//  alert("failed"); 
// } 
//}); 
Cuestiones relacionadas