Переданная строка не отображает объект диаграммы, но при непосредственном вставлении в javascript значение строки.Highcharts - PullRequest
2 голосов
/ 09 июля 2011

На отладке.когда выполнение покидает контроллер, я отлаживаю и переменная содержит:

? sArray {string [17, 2]} [0, 0]: "Arecleoch" [0, 1]: "21" [1,0]: "Barnesmore" [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 голосов
/ 09 июля 2011

В версии, которая работает, данные - это Array из Arrays of String;

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

(обратите внимание, что перед первой скобкой нет противоположных кавычек).

В версии, которая не работает, это строка, представляющая массив. Я подозреваю, что API диаграмм ожидает только Array (в данном случае это массив массивов).

Так что это зависит от того, что это делает:

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

От вашего контроллера и дисплея вашего отладчика я думаю, что данные сами по себе являются массивом массивов. Вы должны напрямую передать его в API диаграмм (без функции sData = data.toString ()), которая фактически преобразует массив ['a', 'b', 'c'] в строку, представляющую массив, например "[' 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...