传递的字符串不会渲染图表对象,但是如果直接粘贴到javascript中的字符串值会这样做。 Highcharts

时间:2011-07-09 16:15:03

标签: javascript jquery json

在调试时。当执行离开控制器我调试并且变量包含:

?sArray {string [17,2]}     [0,0]:“Arecleoch”     [0,1]:“21”     [1,0]:“巴恩斯莫尔”     [1,1]:“3”

等等......

然后在javascript中收到:

?SDATA {...}     [0]:“Arecleoch”     [1]:“21”     [2]:“Barnesmore”     [3]:“3”     [4]:“Beinn An Tuirc”     [5]:“1”     [6]:“Beinn An Tuirc Phase 2”

所以饼图显示为一个实心的圆形

困惑,有什么想法?

以下控制器代码:

    public JsonResult GetChartData_IncidentsBySite()
    {
        var allSites = _securityRepository.FindAllSites();

        var qry = from s in _db.Sites   
                  join i in _db.Incidents on s.SiteId equals i.SiteId 
                  group s by s.SiteDescription 
                      into grp
                      select new
                      {
                          Site = grp.Key,
                          Count = grp.Count()
                      };

        string[,] sArray = new string[qry.Count(),2];
        int y = 0;

        foreach (var row in qry.OrderBy(x => x.Site))
        {
            if ((row.Count > 0) && (row.Site != null))
            {
                sArray[y, 0] = row.Site.ToString();
                sArray[y, 1] = row.Count.ToString();
                y++;
            }
        }

        return Json(sArray , JsonRequestBehavior.AllowGet);
    }

以下是javascript代码:

    $.getJSON(url, null, function(sdata) {

        debugger;
        chart = new Highcharts.Chart({
            chart: {
                renderTo: 'container',
                plotBackgroundColor: null,
                plotBorderWidth: null,
                plotShadow: false
            },

            title: {
                text: 'Number of Environmental Incidents by Site'
            },

            tooltip: {
                formatter: function() {
                    return '<b>' + this.point.name + '</b>: ' + this.y + ' %';
                }
            },
            plotOptions: {
                pie: {
                    allowPointSelect: true,
                    cursor: 'pointer',
                    dataLabels: {
                        enabled: false
                    },
                    showInLegend: true
                }
            },
            series: [{
                type: 'pie',
                name: 'Incidents by Site',
                data: sdata    

  }]
            });
        });
    });

1 个答案:

答案 0 :(得分:0)

在可行的版本中,data是String的数组 Array ;

    data: [["Arecleoch",21], ... 

(请注意,在第一个括号之前没有oppening引号。)

在不起作用的版本中,它是表示Array的String。 我怀疑图表API只期望一个数组(在这种情况下,实际上是一个数组数组)。

所以这取决于它的作用:

$.getJSON(url, null, function(data) {
  // What is the type of data here ? 

从您的控制器和调试器的显示,我认为数据本身就是一个数组数组。您应该直接将它传递给图表API(没有sData = data.toString())函数,它实际上将数组['a','b','c']转换为表示数组的String,如“[” a','b','c']“);

// Callback parameter renamed to show it is an Array of Arrays
$.getJSON(url, null, function(aaData) { 
  // ... skipped ... 
  series: [{
                type: 'pie',
                name: 'Incidents by Site',
                data: aaData /* Use the Array itself */
          }]

编辑:我的解决方案仅在控制器输出如下内容时才有效:

{
  data : [[ "Arecleoch", 21], ["Whatever", 42]]
}

但是看起来您的控制器会返回类似

的内容
{
  data : "[['Arecleoch', 21],['Whatever', 42]]"
}

(也许没有{data:}部分,我不知道你是否需要一个顶级元素,或者你是否正在以JSON方式正确地返回数组)

是这样的吗?如果是这样,那么你必须要么:

  • 更改控制器
  • 在javascript
  • 中解析客户端的字符串