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

Razor页面返回JSON更新Chart.js时AJAX新增数据集报错如何解决?

问题根因

你的报错核心是后端重复序列化了返回结果,导致前端AJAX拿到的res是JSON字符串,不是可直接使用的JavaScript对象,往datasets数组里插入字符串自然会触发类型错误。
具体来说,你在C#后端先手动用JsonConvert.SerializeObject(ds)把对象转成了JSON字符串,再把这个字符串传给JsonResult,而JsonResult本身会自动对传入的对象做一次JSON序列化,最终返回给前端的就是两次序列化后的字符串结果,不是结构化的数据集对象。


修复方案

方案1(推荐,改后端)

删除手动序列化的代码,直接把数据集对象传给JsonResult即可:

public IActionResult OnGetAlgoCBChecked(string sName)
{
    chartDataset ds = new chartDataset();
    ds.label = sName;
    ds.borderWidth = 1;
    ds.borderColor = "rgba(255,99,132,1)";
    ds.backgroundColor= "rgba(255,99,132,1)";
    ds.data.Add(new chartData { x = "2020-01-11", y = 12 });
    ds.data.Add(new chartData { x = "2020-01-12", y = 100 });
    ds.data.Add(new chartData { x = "2020-01-13", y = 2 });
    ds.data.Add(new chartData { x = "2020-01-14", y = 122 });
    ds.data.Add(new chartData { x = "2020-01-16", y = 20 });
    ds.data.Add(new chartData { x = "2020-01-19", y = 2 });

    // 删掉手动序列化代码,直接返回对象
    return new JsonResult(ds);
}

同时建议把chartDataset类里的data字段改为属性,避免部分序列化框架无法正确读取字段值:

public class chartDataset
{
    public string label { get; set; }
    // 改为带get/set的属性,初始化逻辑保留
    public List<chartData> data { get; set; } = new List<chartData>();
    public int borderWidth { get; set; }
    public string borderColor { get; set; }
    public string backgroundColor { get; set; }
}

方案2(临时改前端,不推荐)

如果不方便修改后端代码,可以在前端拿到返回值后手动转成JS对象:

success: function (res) {
    // 先把JSON字符串转成对象再传入
    addDataToChart(JSON.parse(res));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:06:02