我有一个模特:
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);
}
数组是完美创建的,因为我已经调试过,正是我想要的。
然后我通过@ Model.Data将它们传递给Chart.js图表,但是我在控制台上收到错误并且没有显示图表。
<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>
这是我在控制台上遇到的错误:Error on console
Reporting:188 Uncaught SyntaxError: Unexpected token ]
第188行是与@ Model.Data相关的行
var datos = System.Int32[];
非常感谢你提前。
如果你想使用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));
要将服务器端数组传递到客户端数组变量,可以将客户端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()
,这会导致分配数组类型的完全限定名称而不是序列化数组内容。
如chart.js here is link for documentation of chart.js的文档中所示,您必须以数组格式提供数据集和标签。
尝试使用传递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引擎你可以在运行时使用toarray函数将它转换为数组