2012-01-25 3 views
4

mvc 앱에서 Google 차트를 작성하려고합니다. 여기 보기에서 자바 스크립트의 MVC3 모델 속성에 액세스

구글 차트의 조각입니다 자바 스크립트

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

} 나는 기본적으로 내 모델의 항목을 반복하는 for 루프와 위의 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 serializer를 사용했기 때문에 작은 따옴표 나 큰 따옴표가 포함되어있어 자바 스크립트가 손상 될 수 있다는 점에 대해 걱정할 필요가 없습니다.

+0

내 모델에는 "미리 만들어진"값 모음이 없다는 것은 매우 가깝다고 생각합니다. 모델은 실제로 변경하기 어려운 클래스입니다. 이 메서드는 "AppItems"목록을 반환합니다. public List Apps() { Uri appsUri; Uri.TryCreate (ApiTarget, "/ apps", out appsUri); var result = _restClient.Get (appsUri); var apps = JsonConvert.DeserializeObject <목록 > (결과); 앱 돌아 가기; } 그래서 내가 필요하다고 생각하는 항목을 반복하고 그들을 자바 스크립트에 추가하는 방법입니다. – Chris

+0

@Chris, 당신은 매우 쉽게 변경할 수 있어야합니다. 그것이 뷰 모델이 의도 한 것입니다. 도메인 모델을보기로 전달하지 않습니다. 그렇습니까? 뷰에 대한 특정 뷰 모델을 항상 정의하고 도메인 모델을 통과시키지 않아야합니다. 따라서이 뷰에 필요한 모든 것을 포함 할 뷰 모델을 정의하십시오. 나는 당신이 필요로 할지도 모르는 다른 것들이 무엇인지 모르지만'공공의 가치 '{} Values ​​{get; 세트; } '속성은 자바 스크립트를 생성해야합니다. 필요한 다른 속성을 포함 할 수 있습니다. 따라서 컨트롤러에서 모델을보기 모델에 매핑합니다. –

+0

네, 직접 내 도메인 모델을 뷰에 전달한 것 같습니다. (이 조언을 받아 도메인 클래스를 나타내는 모델을 만듭니다.) – Chris

관련 문제