2012-01-25 15 views
4

mvcアプリケーションでGoogleチャートを作成しようとしています。ここで ビュー内のJavascriptからMVC3モデルプロパティにアクセス

は、Googleのチャートの抜粋であるjavascriptの

function drawChart() { 
var data = new google.visualization.DataTable(); 
    data.addColumn('string', 'Task'); 
    data.addColumn('number', 'Hours per Day'); 
    data.addRows([ 

     ['Work', 11], 
     ['Eat',  2], 
     ['Commute', 2], 
     ['Watch TV', 2], 
     ['Sleep', 7] 
    ]); 

}私は基本的に私のモデル内の項目を反復ループのために上記data.addRowsラインを交換されてやりたいものを

。私は当然のようにのようなタグの外観図でうまく繰り返すことができます:

"@foreach (var item in Model) { 
    <div>@Html.DisplayFor(modelItem => item.Customer.Name)</div> 
    }" 

私はタグ内の私のモデルを反復処理するための解決策を見つけるように見えることはできません。何か案は?あなたには、いくつかの値を格納し、ビューに沿って渡す

public class MyViewModel 
{ 
    public object[][] Values { get; set; } 
} 

れる:

答えて

7

ビューモデル持っていると仮定すると、あなたのビューで

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Values = new[] 
      { 
       new object[] { "Work",  11 }, 
       new object[] { "Eat",  2 }, 
       new object[] { "Commute", 2 }, 
       new object[] { "Watch TV", 2 }, 
       new object[] { "Sleep", 7 }, 
      } 
     }; 
     return View(model); 
    } 
} 

をあなたはJSONはそれをエンコードすることができます:

@model MyViewModel 
<script type="text/javascript"> 
    function drawChart() { 
     var data = new google.visualization.DataTable(); 
     data.addColumn('string', 'Task'); 
     data.addColumn('number', 'Hours per Day'); 
     data.addRows(@Html.Raw(Json.Encode(Model.Values))); 
    } 
</script> 

最終的なマークアップでレンダリングされる:

<script type="text/javascript"> 
    function drawChart() { 
     var data = new google.visualization.DataTable(); 
     data.addColumn('string', 'Task'); 
     data.addColumn('number', 'Hours per Day'); 
     data.addRows([["Work",11],["Eat",2],["Commute",2],["Watch TV",2],["Sleep",7]]); 
    } 
</script> 

JSONシリアライザを手動で構築するのではなく、JavaScriptを破損する可能性のある一重引用符や二重引用符が含まれていることを心配する必要はありません。

+0

これは非常に近いと思いますが、私のモデルには「既成」の値のコレクションがありません。モデルは実際には変更が困難なクラスです。このメソッドは "AppItems"のリストを返します。public List Apps() { Uri appsUri; Uri.TryCreate(ApiTarget、 "/ apps"、out appsUri); var result = _restClient.Get(appsUri); var apps = JsonConvert.DeserializeObject <リスト>(結果); return apps; }だから、私が必要と思うのは、アイテムを繰り返し処理し、それらをJavaScriptに追加する方法です。 – Chris

+0

@Chris、あなたは非常に簡単にそれを変更することができるはずです。それはビューモデルが意図しているものです。ドメインモデルをビューに渡すのではないですか?ビューには特定のビューモデルを常に定義し、ドメインモデルは一度も渡すべきではありません。そこで、このビューに必要なすべてを含むビューモデルを定義してください。私はあなたが必要とするかもしれない他のものが何かを知っていませんが、 'public [[Values] {get;セット; }プロパティは、javascriptを生成するために必要です。必要な他のプロパティを含めることができます。あなたのコントローラでは、モデルをビューモデルにマッピングします。 –

+0

はい、私はドメインモデルを直接ビューに渡しています:(私はこのアドバイスを受けて、ドメインクラスを表すモデルを作成します)ありがとう! – Chris

関連する問題