#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