我正在构建一个 .NET Core Web 应用程序。我的目标是构建一个包含饼图的 Razor 组件,然后在我的项目中通过不同的数据输入重新使用该组件。问题是我无法在组件内添加配置每个饼图所需的脚本。
这是组件的外观:
@using PieChartProject.Models;
<div style="max-width:350px; max-height:195px;">
<canvas id="myChart @Chart.Id"></canvas>
</div>
@code {
[Parameter]
public PieChartViewModel Chart{ get; set; }
}
这是我认为调用该组件的代码:
<div class="row">
@foreach (var chart in Model.PieCharts)
{
<div class="col-md-6">
@(await Html.RenderComponentAsync<PieChartRazorComponent>(RenderMode.ServerPrerendered, new { Chart = chart}))
</div>
}
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.js"></script>
<script>
var ctx = document.getElementById('myChart').getContext('2d'); //this needs to be changed for every chart
var myChart = new Chart(ctx, {
type: 'pie',
data: {
datasets: [{
data: [25,75], //this needs to be changed for every chart
backgroundColor: [
'rgba(255, 99, 132, 0.7)',
'rgba(54, 162, 235, 0.7)'
],
borderColor: [
'rgba(256, 256, 256, 1)',
'rgba(256, 256, 256, 1)'
],
borderWidth: 2,
//label: ''
}],
labels: ['Yes', 'No'] //this needs to be changed for every chart
},
options: {
legend: {
display: true,
position: 'bottom',
labels: {
generateLabels: function (chart) {
var data = chart.data;
if (data.labels.length && data.datasets.length) {
return data.labels.map(function (label, i) {
var meta = chart.getDatasetMeta(0);
var ds = data.datasets[0];
var arc = meta.data[i];
var custom = arc && arc.custom || {};
var getValueAtIndexOrDefault = Chart.helpers.getValueAtIndexOrDefault;
var arcOpts = chart.options.elements.arc;
var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);
var stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);
var bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);
var value = chart.config.data.datasets[arc._datasetIndex].data[arc._index];
return {
text: label + " : " + value,
fillStyle: fill,
strokeStyle: stroke,
lineWidth: bw,
hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
index: i
};
});
} else {
return [];
}
}
}
}
}
});
</script>
如果只有一个组件,这一切都很好,但我似乎无法找到一种方法让它与多个组件一起工作。
我在脚本标签中为每个饼图需要以某种方式更改的 3 个属性添加了注释。
我还找到并尝试了 mariusmuntean 的 Chart.Js Blazor 库,但我无法让它工作。我认为它没有为我显示任何图表,因为它需要在 Blazor 项目中使用,而不是在 .NET Core MVC 中使用?
只要我在 Razor 组件内创建饼图,任何类型的解决此问题的方法都是受欢迎的。