You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Chart.js与Razor实现在线投票图表展示遇JSON转换问题

解决Chart.js柱状图无选项文本和投票数值的问题

看起来你遇到的核心问题是Chart.js需要的labels和data是分开的数组类型,但你把整个DataPoint对象数组同时传给了这两个属性,导致Chart.js无法正确解析标签和数值,所以出现了空柱子的情况。

问题根源分析

你的前端代码中,labels和datasets[0].data都使用了@Html.Raw(ViewBag.DataPoints),但这个变量序列化后是包含labels和data字段的对象数组(比如[{labels:"选项1", data:5}, {labels:"选项2", data:3}])。而Chart.js要求:

  • labels必须是字符串数组(比如["选项1", "选项2"])
  • data必须是数值数组(比如[5, 3])

直接传入对象数组会让Chart.js无法识别,所以柱子既没有标签也没有数值。

方案一:修改控制器,拆分数据传递

在控制器里把标签和投票数分别提取成数组,再序列化传给前端:

// 替换原来的DataPoint列表代码
List<string> answerLabels = new List<string>();
List<double> voteCounts = new List<double>();

foreach (var resposta in poolDbContext.Answers)
{
    answerLabels.Add(resposta.Text);
    voteCounts.Add(resposta.Votes.Count()); // 注意这里你原来写的是answer,应该是resposta吧?
}

ViewBag.Labels = JsonConvert.SerializeObject(answerLabels);
ViewBag.Votes = JsonConvert.SerializeObject(voteCounts);
ViewBag.Data = question.Answers;
ViewBag.ObjectName = question.Text;

然后修改前端代码,分别使用这两个变量:

<script>
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: @Html.Raw(ViewBag.Labels),
        datasets: [{
            label: 'Numero de respostas',
            data: @Html.Raw(ViewBag.Votes),
            borderWidth: 1,
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero: true
                }
            }]
        }
    }
});
</script>

方案二:前端直接处理对象数组(无需修改控制器)

如果你不想改动后端代码,可以在前端用JavaScript从DataPoint对象数组中提取需要的标签和数值:

<script>
// 先把序列化后的对象数组转为JS对象
var dataPoints = @Html.Raw(ViewBag.DataPoints);
// 提取标签数组
var answerLabels = dataPoints.map(item => item.labels);
// 提取投票数数组
var voteCounts = dataPoints.map(item => item.data);

var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: answerLabels,
        datasets: [{
            label: 'Numero de respostas',
            data: voteCounts,
            borderWidth: 1,
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero: true
                }
            }]
        }
    }
});
</script>

额外注意点

检查你的控制器代码里的变量名:answer.Votes.Count()应该是resposta.Votes.Count()吧?不然会报变量未定义的错误。

这样修改后,Chart.js就能正确识别标签和投票数值,显示正常的柱状图了。

内容的提问来源于stack exchange,提问作者Dorin Munreanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:22:07