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

使用数据库JSON数据动态填充Google Gantt甘特图无法显示问题求解

问题排查与解决方案

已确认错误点

  • 语法错误:原始代码和修改后的代码都存在$.getJSON回调函数缺少闭合右括号)的问题,修改后的版本还额外新增了冗余的AJAX请求,逻辑完全冲突
  • 日期格式不兼容:ASP.NET MVC默认返回的JSON日期为/Date(时间戳)/格式,无法直接被Google甘特图识别为JS Date对象,需要手动转换
  • 隐性风险:直接用TaskName作为Task ID,若存在重名任务会触发唯一键冲突,导致渲染失败

修正步骤

1. 后端代码调整(可选,也可仅在前端处理日期转换)

提前将日期转为标准格式字符串,降低前端处理成本:

public ActionResult GetChartData()
{
    var schedulingData = db.Schedules.Select(x => new{ 
        x.StartDate,
        x.EndDate,
        x.TaskName
    }).ToList().Select(x => new {
        x.TaskName,
        StartDate = x.StartDate.ToString("yyyy-MM-dd"),
        EndDate = x.EndDate.ToString("yyyy-MM-dd")
    });
    return Json(schedulingData,JsonRequestBehavior.AllowGet);
}

2. 前端代码修正(完整版)

修复语法问题,统一请求逻辑,添加日期转换处理:

<html>
<head>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
    // 请确保页面已提前引入jQuery库,否则$相关方法会执行报错
    google.charts.load('current', { 'packages': ['gantt'] });
    google.charts.setOnLoadCallback(drawChart);

    function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Task ID');
        data.addColumn('string', 'Task Name');
        data.addColumn('string', 'Resource');
        data.addColumn('date', 'Start Date');
        data.addColumn('date', 'End Date');
        data.addColumn('number', 'Duration');
        data.addColumn('number', 'Percent Complete');
        data.addColumn('string', 'Dependencies');   

        $.getJSON("@Url.Action("GetChartData")", function (chartData) {
            $.each(chartData, function (i, item) {
                // 转换为Google甘特图可识别的日期对象
                let start = new Date(item.StartDate);
                let end = new Date(item.EndDate);
                // 用索引作为Task ID,避免重名冲突
                data.addRow([i.toString(), item.TaskName, "test", start, end, null, 100, null]);
            });
            // 数据加载完成后再渲染图表,必须放在回调内部
            var options = {
                height: 400,
                gantt: {
                    trackHeight: 30
                }
            };
            var chart = new google.visualization.Gantt(document.getElementById('chart_div'));
            chart.draw(data, options);
        });
    }
</script>
</head>
<body>
<div id="chart_div"></div>
</body>
</html>

3. 若不修改后端代码,可使用以下方法转换ASP.NET默认日期格式

// 前端解析ASP.NET默认日期格式的方法
function parseNetDate(dateStr) {
    return new Date(parseInt(dateStr.replace("/Date(", "").replace(")/",""), 10));
}
// 调用示例
let start = parseNetDate(item.StartDate);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:45:02