2

MVCビュー(VS 2012 RCを使用)で、コントローラーから新たに返されたXMLを解析しようとしています。これが私のビューコードです:

@model RzMvc.Models.PortfolioResponse
@{
    ViewBag.Title = "PortfolioList";
}              

<script type="text/javascript">

    $(displayXmlResponse);

    function displayXmlResponse(){
        var resp = $("#xmlResp");
        $("#xmlTest").append(resp.children());

        var xml = $("xmlResp").text;      
            xmlDoc = $.parseXML(xml),
            $xml = $(xmlDoc),
            $title = $xml.find("portfolioSummary");            

        $("#xmlTest").append($title.text());      
    }    

</script>

<h2>PortfolioList</h2>

<div>
    <p id="xmlTest"></p>
    <p id="xmlResp" >@Model.XmlPortfolioResponse</p>    
</div>

ブラウザの出力は次のようになります。

PortfolioList

ポートフォリオリスト

System.Xml.XmlDocument

任意のガイダンスをいただければ幸いです。これが私のコントローラーコードの一部です:

    public ActionResult PortfolioList()
{
    XmlDocument xmlResponse = new XmlDocument();
    xmlResponse.LoadXml(portfoliosResponse);
    var portf = new PortfolioResponse { XmlPortfolioResponse = xmlResponse };


    return View(portf);
}

モデルコードは次のとおりです。

namespace RzMvc.Models
{

    public class PortfolioResponse
    {
        public XmlDocument XmlPortfolioResponse { get; set; }
    }
}
4

3 に答える 3

1

問題は、オブジェクトを返しているがPortfolioResponse、そのプロパティの値を出力ではなく、それ自体XmlPortfolioResponseと等しくなるように設定していることです。XmlDocumentこれにより、画面にバインドしたときにデフォルトの C# 出力が発生します。これは単に呼び出すだけでPortfolioResponse.XmlPortfolioResponse.ToString()あり、オーバーロードされていない限り、Objectのクラスの名前を返します。Hense - System.Xml.XmlDocumentHTML への出力を取得しています。

何よりもまず、 .@Model.XmlPortfolioResponse.OuterXmlではなく、ビュー ページにバインドする必要があります@Model.XmlPortfolioResponse@Html.Raw()また、実際に適切にレンダリングするには、この値を呼び出しでラップする必要があります。

View ページの新しいバインディングは次のようになります。

<div class='XmlTest'></div>
<div class='XmlPortfolioResponse'>
 @Html.Raw(Model.XmlPortfolioResponse.OuterXml.ToString())
</div>

JQuery の場合、それを解析するには、次のようにします。

var $title = $('.XmlPortfolioResponse').find('portfolioSummary').text();
$('.XmlTest').text($title);

ただし、未加工の XML をページにバインドし、それを解析/再フォーマット/再表示するよりも洗練されたアプローチを検討することもできます。これは、DOM の肥大化と多くの余分な処理作業につながります。2つのアプローチのいずれかをお勧めします。

1) XML を出力し、XML を直接スタイルします。CSS は、出力する XML のスタイルを設定し、必要に応じて表示することができます (フォーマットに大きな変更を加えていない場合) 。例は次のようになります。

<div class='XmlPortfolioResponse'>
  <portfolioSummary>
    <value>123456.78</value>
    <assets>
      <asset>
        <ticker>XYZ</ticker>
        <quantity>50</quantity>
        <value>456.78</value>
      </asset>
    </assets>
  </portfolioSummary>
</div>

この種の XML (属性は少ないが十分に正規化されている) がある場合、次のようなスタイルシートを作成できます。

portfolioSummary {
    display: block;
    border: 1px solid #eee;
    background: #fff;
    position: relative;
    margin-top: 25px;
    width: 100%;
    height: 100%;
    /* Whatever other styles you want for layout */
}
portfolioSummary value {
    float: right;
    font-weight: bold;
    position: absolute;
    top: 5px; right: 5px;
}
portfolioSummary asset {
    display: block;
}
/* Etc. */

つまり、XML を直接スタイル設定します。

2) ただし、次のような XML がある場合:

<div class='XmlPortfolioResponse'>
  <portfolioSummary value='123456.78'>
   <asset value='456.78' ticker='XYZ'>
   </asset>
  </portfolioSummary>
</div>

言い換えれば、スタイリングに向いていない属性に重きを置いています... AJAX経由でデータをロードすることを検討してください。JQuery は次のように変更されます。

$.ajax({
    url: '/Portfolio/Load/12345',
    type: 'POST',
    async: true,
    success: function (data) {
        if (!data) // do validation
            alert('failed!');
        else {
            var $xml = $(data);
            var $title = $xml.find('portfolioSummary').text();
            $('.XmlTest').text($title);
        }
    },
    error: function (error) {
        alert('failed!');
    }
});

下部のメソッドを使用するに$.ajax()は、次のようなコントローラー メソッドが必要です。

[HttpGet] // Original Method - allows GET
public ActionResult PortfolioList {
    return View(GetPortfolios()); // Or however you load them...
}

[HttpPost] // Allows this method to be accessed via POST calls
[ActionName("PortfolioList")]
public JsonResult PortfolioList_Async {        
    return Json(GetPortfolios()); // You may need to resolve serialization here,
                                  // but usually it works well out of the box.
}
于 2012-06-25T21:53:08.873 に答える
0

コントローラー自体で、xml データをポートフォリオ概要のリストなどの必要なオブジェクトに変換し、viewdata または viewbag を使用してそのオブジェクトをビューに渡します。

 XmlNodeList elemList =xmlresponse.DocumentElement.GetElementsByTagName("portfoliosummary");
            List<string> lstportfoliosummarys= new List<string>();
            for (int i = 0; i < elemList.Count; i++)
            {
                if (elemList[i].ChildNodes[1].InnerText == "portfoliosummary")
                    lstEmails.Add(elemList[i].ChildNodes[2].InnerText);
            }
            ViewBag.contacts = new SelectList(lstportfoliosummarys);

これがあなたを助けることを願っています。

于 2012-06-25T21:40:40.037 に答える
0

クライアントに送信する前に、XmlDocument を文字列に変換する必要があります。これを行う最も簡単な方法は、 を呼び出すこと.OuterXmlです。

于 2012-06-25T21:26:35.983 に答える