2013-11-20 67 views
4

我在寫一個API和顯示數據圖表的網站。我編寫了一個抽象的「圖表」對象,其中包含諸如Series集合,各種顯示選項以及您期望在Chart對象上找到的其他內容。MVC Javascript對象

我正在使用這個抽象的Chart對象來允許我的API的用戶創建一個圖表,API可以格式化爲許多不同的輸出。例如,它可以使用MSCharts創建圖表圖像,然後使用我自己抽象的圖表對象中的適當設置填充圖表圖像。

我也試圖獲得它,這樣我的網站部分可以使用jqPlot輸出一個漂亮的動態JavaScript圖表。我最初的計劃是擁有一個MVC Partial視圖,它將我的Chart對象作爲模型,並將其轉換爲JavaScript。這對格式變得非常痛苦,跳入Razor代碼做決定,輟學輸出JavaScript等等。

$.jqplot("chart", data, { 
    @if (chart.Animate) { <text>animate: true,</text> } 
    @if (chart.Animate) { <text>animateReplot: true,</text> } 
    title: '@Model.Title',     
... 

這是比較基本的,但是當你得到儘可能吐出系列格式化信息,它變得不合理複雜,不是我想保持。

我的下一個計劃是一個MVC行動可能只是輸出使用return Json(...

這很好地工作,以點(C#代碼)

chart = new 
{ 
    animate = abstractedChart.Animate, 
    animateReplot = abstractedChart.Animate, 
    title = v.Title, 
    axes = new 
     { 
     xaxis = new 
      { 

整個圖表對象...

但是當你開始格式化這個系列的時候它會下降。 jqPlot要我做這樣的事情:

series: [{ 
    renderer: $.jqplot.LineRenderer 
.... 

我想不出輸出以這種方式從MVC「引用」爲JavaScript對象的一種方式。

在這一點上,我開始認爲我可能需要編寫一些東西來吐出原始JavaScript,然後在我的部分視圖中使用Html.Raw(),但我始終認爲必須有更好的方法。

所以這是我的問題 - 有沒有更好的方法?

+0

C#<-->在MVC中的JavaScript是我也很努力的。很好的問題。我希望有一個體面的答案出現。明天我要開始調查羅斯林這種事情。 –

回答

0

通過部分視圖呈現JavaScript代碼很難維護,第二個選擇更清晰。圖JSON應儘可能獨立於JS渲染庫,因此您可以在將來更改庫而不觸及MVC代碼。最後一部分,使其工作將是從圖表JSON到jqplot特定輸入的JavaScript映射器。這樣的事情:

var jqPlotMapper = { 
    mapOptions : function (chartOptions) 
    { 
     return { seriesDefaults:{ 
       renderer: this.getSeriesRenderer(chartOptions.chartType) 
     }}; 
    },  
    getSeriesRenderer : function (chartType) 
    { 
     switch(chartType) 
     { 
      case "line": return $.jqplot.LineRenderer; 
      case "bar": return $.jqplot.BarRenderer;  
     } 
    } 
}; 

$(document).ready(function(){ 
    var chart = {}; 
    chart.Data = [[2, 6, 7, 10]]; 
    chart.Options = { chartType: "bar"}; 
    plot1 = $.jqplot('chart1', chart.Data, jqPlotMapper.mapOptions(chart.Options)); 
});