Импорт данных из модели в представление выдает ошибку, которую я не могу решить

#c# #asp.net #asp.net-mvc #chart.js

#c# #asp.net #asp.net-mvc #chart.js

Вопрос:

У меня есть модель:

 public class ReportViewModel
{
    public int[] Data { get; set; }
    public string[] Labels { get; set; }
}
  

Затем в контроллере я получаю данные и метки и сохраняю их в модели, которая будет отправлена в представление:

 [HttpGet]
    public async Task<IActionResult> Report()
    {

        ReportingViewModel vm = new ReportingViewModel();
        vm.Data = DataReporting(vm);
        vm.Labels = LabelReporting(vm);
        return View(vm);
    }
  

Массивы созданы идеально, потому что я отладил их и это именно то, что я хочу.

Затем я передаю их в представление в Chart.js график через @Model.Данные, но я получаю сообщение об ошибке на консоли, и график не отображается.

 <div id="container" class="align-items-center" style="width:75%; margin: 0 auto" ;>
    <canvas id="myChart" width="682" height="340"></canvas>
    <script>
        var colorbarra = Array(78).fill('rgba(54, 162, 235, 0.2)');
        var colorborde = Array(78).fill('rgba(54, 162, 235, 1)');
        var datos = @Model.Data;
        var etiquetas = @Model.Labels ;
        var ctx = document.getElementById("myChart");
        var myChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: etiquetas,
                datasets: [{
                    label: 'Nº de Custodios subidos',
                    data: datos,
                    backgroundColor: colorbarra,
                    borderColor: colorborde,
                    borderWidth: 1
                }]
            },
            options: {
                scales: {
                    yAxes: [{
                        ticks: {
                            beginAtZero: true
                        }
                    }]
                }
            }
        });
    </script>
</div>
  

Это ошибка, которую я получаю на консоли:
Ошибка на консоли

 Reporting:188 Uncaught SyntaxError: Unexpected token ]
  

А строка 188 — это строка, связанная с @Model.Data

 var datos = System.Int32[];
  

Заранее большое вам спасибо.

Комментарии:

1. Любые несоответствия в коде, такие как Report или отчетность, вызваны тем, что я немного изменил его, поскольку это связано с работой.

2. Я предполагаю, что вы ожидаете эту модель. Метки содержат данные (например, [1,233,32])? Но @Model. Labels печатает тип (System.Int32[]), и это недопустимый Javascript…

3. б) Вы смешиваете JavaScript и C #. Это не сработает.

4. System.Int32 [] это не javascript. Начните оттуда, вы, вероятно, вызываете ToString где-нибудь массив.

5. @VDWWD — подразумевается toString(). Это все, что @Model.Data можно сделать.

Ответ №1:

Если вы хотите использовать свойства view models в javascript, вам нужно преобразовать его следующим образом,

 var datos = JSON.stringify(@Model.Data);
var etiquetas = JSON.stringify(@Model.Labels);
  

Или вы можете использовать

 var datos = @Html.Raw(Json.Serialize(@Model.Data));
var etiquetas = @Html.Raw(Json.Serialize(@Model.Labels));
  

Комментарии:

1. Вы это тестировали? Я думаю, вам придется сериализовать в контроллере.

2. @MiguelCordero, ответ обновлен, пожалуйста, попробуйте второй

3. Могу я сказать, что люблю тебя? Это работает, большое вам спасибо!

4. рад слышать и приветствовать, пожалуйста, отметьте галочку в левой части ответа, чтобы она стала зеленой 🙂

Ответ №2:

Чтобы передать массив на стороне сервера в переменную массива на стороне клиента, вы можете использовать JSON.parse() функцию на стороне клиента с Json.Encode() :

 var datos = JSON.parse(@Html.Raw(Json.Encode(Model.Data));
var etiquetas = JSON.parse(@Html.Raw(Json.Encode(Model.Labels));
  

Или, если у вас есть Newtonsoft.Json пакет, вам следует попробовать использовать JsonConvert.SerializeObject() метод:

 var datos = JSON.parse(@Html.Raw(JsonConvert.SerializeObject(Model.Data));
var etiquetas = JSON.parse(@Html.Raw(JsonConvert.SerializeObject(Model.Labels));
  

Если массив передается напрямую, как @Model.Data , ToString() будет неявно вызван, что приведет к присвоению полного имени типа массива вместо сериализованного содержимого массива.

Комментарии:

1. Я думаю, это тоже работает, большое вам спасибо, но без JSON.parse, уже работает, но спасибо!

Ответ №3:

Как указано в документации chart.js вот ссылка для документации chart.js вы должны предоставить dataset и ярлык в формате массива.

Попробуйте использовать передачу ienumerable для передачи модели в представление, что приведет к преобразованию в массив. Вашему классу должно понравиться это

 public class ReportViewModel { 
   public innumerable<data> cData { get; set; } 
   public innumerable<label> cdata { get; set; }
}
  

И ваш класс для данных и метки должен быть определен в пространстве имен модели
Модель данных:

 Public class data{
    Public int value{get;set;}
}
  

Модель метки

 Public class label{
    Public string name{get;set;}
}
  

И в представлении вам нужно импортировать модель, которая должна быть передана с контроллера, и вы можете напрямую использовать это, а с помощью razor engine вы также можете преобразовать ее в массив во время выполнения с помощью функции toarray