2009-09-02 93 views
5

我正在嘗試使用帶有asp.net mvc的jquery flot圖形插件。我試圖動態從JsonResult中提取數據以填充圖形。ASP.NET MVC JsonResult和JQuery flot

我的問題是,我似乎無法得到從正確的格式JsonResult返回的數據。

這裏是我的服務器端代碼:

public ActionResult JsonValues() 
    { 
     IList<IDictionary<string, int>> listofvalues = new List<IDictionary<string, int>>(); 
     IDictionary<string, int> values1 = new Dictionary<string, int>(); 
     values1.Add("2003", 10882); 
     values1.Add("2002", 10383); 
     values1.Add("2001", 10020); 
     values1.Add("2000", 9762); 
     values1.Add("1999", 9213); 
     values1.Add("1998", 8720); 

     IDictionary<string, int> values3 = new Dictionary<string, int>(); 
     values3.Add("2003", 599); 
     values3.Add("2002", 510); 
     values3.Add("2001", 479); 
     values3.Add("2000", 457); 
     values3.Add("1999", 447); 
     values3.Add("1998", 414); 

     listofvalues.Add(values1); 
     listofvalues.Add(values3); 

     JsonResult result = new JsonResult { Data = listofvalues }; 
     return result; 
    } 

,這裏是我的客戶端代碼:

$(function() { 
     $.getJSON("/path/to/JsonValues", function(data) { 
      var plotarea = $("#plot_area"); 
      $.plot(plotarea, data); 
     }); 
    }); 

注意,下面的客戶端代碼工作正常:

$(function() { 
     var points = [ 
      [[2003, 10882], 
      [2002, 10383], 
      [2001, 10020], 
      [2000, 9762], 
      [1999, 9213], 
      [1998, 8720]], 

      [[2003, 599], 
      [2002, 510], 
      [2001, 479], 
      [2000, 457], 
      [1999, 447], 
      [1998, 414]] 
     ]; 

     var plotarea = $("#plot_area"); 
     $.plot(plotarea, points); 
    }); 

鑑於上述工作正常,似乎它只是正確格式化返回的JsonResult的問題。我怎樣才能做到這一點?字典列表是要返回的最佳類型,還是應該使用其他內容?或者是否有JavaScript中的函數,我應該用它來正確地格式化數據?

看起來像一個非常簡單的事情,但我不能完全得到它的工作。

回答

4

檢查您的JSON返回給客戶端,它會隨着鍵值對的JSON對象,這樣的:

{{'2003':10882,'2002':10383},....} 

在哪裏,你需要一個數組的數組。

[[[2003, 10882],[2002, 10383]],...] 

你總是可以生成JSON字符串自己和返回結果

StringBuilder sb = new StringBuilder(); 
sb.append("[2003,10882],") 
return Json("[" + sb.ToString() + "]"); 

或者你可以嘗試存儲這可能會產生所需的JSON數組你的價值觀,但我還沒有試過。

+0

我第一次使用ŧ他的答案爲我的程序,但我發現了一個不同的更好的解決方案如下:http://stackoverflow.com/a/19114827/605586 – Thomas

4

如果你想用C#數組做到這一點,你可以做到以下幾點:

var values = new object[] { 
    new object[] /* First series of value */ 
    { 
     new int[,] { {2003,10882} }, 
     new int[,] { {2002,10383} } 
    } 
}; 

然後

return Json(values); 
+0

時尚解決方案...適用於我。謝謝 –

4

您需要在形式的JSON陣列:

[[1, 1], [2, 3], [5, 5]] 

flot類別插件需要以下格式的數據:

[["category1", 12], ["category2", 3]] 

這不是簡單的在C#創建(不得不尋找了很久:-))

的關鍵是創建對象數組(object []

未經測試的代碼如下:

IEnumerable<object[]> values1_array = from x in values1 
select new object [] {x.Key, x.Value}; 

IEnumerable<object[]> values3_array = from x in values3 
select new object [] {x.Key, x.Value}; 

//create one big object 
var dataArray = new object[] { 
    new {data = values1_array, label="Values1"}, 
    new {data = values3_array, label="Values3"}, 
}; 

//return Json data 
return Json(dataArray) /* JsonRequestBehavior.AllowGet ?*/ 

你的JavaScript代碼應工作:

$(function() { 
    $.getJSON("/path/to/JsonValues", function(data) { 
     var plotarea = $("#plot_area"); 
     $.plot(plotarea, data); 
    }); 
});