2012-06-22 14 views
9

Chciałbym wskazówek w zwracaniu dokumentu XML z kontrolera do widoku. Moim zdaniem, chciałbym przejść do dokumentu XML za pomocą JQuery. Istnieje wiele przykładów online wykorzystujących JQuery do tego zastosowania.W ASP.NET MVC, jak zwrócić dokument xml do widoku

Mam poniżej kontroler PortfolioList(), który właśnie teraz zwraca widok, ale chciałbym dowiedzieć się, jak ZWRÓCIĆ ODPOWIEDŹ XML. Zauważysz poniżej, że piszę odpowiedź XML do lokalnego pliku tylko do celów testowych ...

Czy muszę w sposób przejrzysty stworzyć dla tego model?

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

Tak, powinieneś tworzyć modele dla wszystkich widoków zawierających dowolne dynamiczne dane. W ten sposób zawsze jest czystszy. – EkoostikMartin

Odpowiedz

10

Możesz to zrobić w następujący sposób.

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

Jeśli to zrobisz, jak wygląda widok? – EkoostikMartin

+0

Widok czasu projektu jest pusty, ale odpowiedź w czasie wykonywania będzie twoim Xml – Kaf

+0

To nie zadziała w przypadku użycia OP - "Moim zdaniem chciałbym przejść przez dokument XML używając JQuery." – EkoostikMartin

1

Jeśli powracający dokument XML z działania kontrolera jest wszystkim, o lepszym pomysłem jest tworzenie niestandardowego wyniku akcji.

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); 
    } 
} 

Teraz można powrócić XML z działania jak,

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

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

Mark, To wygląda bardzo interesująco. Widziałem ten pomysł opublikowany w podobnym postu xml, ale omawiali MVCContrib na Codeplex (akcja XmlResult). W każdym przypadku post zawierał także przesłonięcie do metody ExecuteResult(). Dziękuję, ponieważ będę eksperymentować z tym pronto !!! :-) - Bob –

+0

InnerXml nie będzie miał całego dokumentu. To jest niepoprawne. –

0

oparciu o opinię innego dewelopera, jadę trasą format danych JSON. Okazuje się, że zwrócenie dokumentu XML z kontrolera asp.net z powrotem do widoku jest kompletnym koszmarem (tj. Mogę zwrócić dokument XML sam do przeglądarki, ale nie mogę wymyślić jak użyć jQuery do przetworzenia xml węzły).

Poszedłem na ścieżkę deserializacji dokumentu XML po stronie serwera, i zwróciłem JsonResult do mojego widoku (to znaczy za pomocą procedury Ajax JQuery do wywołania kontrolera).

przykładowy kod XML serializacji: http://msdn.microsoft.com/en-us/library/58a18dwa.aspx#Y0

0

znalazłem jQuery przykładowy kod online, która pracuje dla mnie! Próbka kod analizuje dokument XML w następujący sposób (URL jest 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/>"); 


    }); 
} 

Jednak nie rozumiem czegoś takiego NIE działa (ale raczej po prostu zrzuca całą innerText każdego jeden element na mojej stronie) ... przepraszam za skomentowane wiersze:

//$.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"); 
// } 
//}); 
Powiązane problemy