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

FullCalendar(v4)通过JSON加载事件失败技术求助

FullCalendar v4 无法通过JSON接口加载事件问题排查与解决建议

我完全懂这种头疼的感觉——硬编码事件能正常显示,说明前端配置基本没问题,但换接口加载就没反应,还没控制台报错,排查起来确实挠头。结合你提供的代码和信息,我整理了几个关键排查点和解决方案:


1. 优先排查:后端Json.Net版本的双重序列化问题

你当前的Json.Net实现代码有个很容易踩的坑:

string jsonData = JsonConvert.SerializeObject(events);
return Json(jsonData, JsonRequestBehavior.AllowGet);

这里的Json()方法会把已经序列化好的jsonData字符串再次转义序列化,导致前端拿到的不是预期的数组[{...}, {...}],而是一个带引号的字符串"[{...}, {...}]"。FullCalendar需要的是JSON数组,自然无法识别这种格式。

修正写法:直接用Content返回序列化后的JSON字符串,避免双重处理:

public ActionResult GetAllEventsAsJson(DateTime? start = null, DateTime? end = null)
{
    var events = db.CourseTimetables
        .Where(p => p.StartTime >= start && p.EndTime <= end)
        .Select(s => new 
        { 
            id = s.Id, 
            title = s.Title, 
            start = s.StartTime, 
            end = s.EndTime 
        }).ToList();

    var jsonSettings = new JsonSerializerSettings
    {
        DateFormatString = "yyyy-MM-ddTHH:mm:ss", // 强制输出ISO格式日期
        DateTimeZoneHandling = DateTimeZoneHandling.Local
    };
    string jsonData = JsonConvert.SerializeObject(events, jsonSettings);
    return Content(jsonData, "application/json");
}

2. 确认日期格式严格匹配FullCalendar要求

FullCalendar v4只认ISO 8601格式的日期字符串(比如"2019-08-28T08:00:00"),哪怕你的日期看起来是ISO格式,也要确保:

  • 后端返回的start/end是字符串类型,不是日期对象被序列化后的其他格式
  • 如果直接用ToString()转日期,要指定格式:s.StartTime.ToString("yyyy-MM-ddTHH:mm:ss")

3. 检查前端请求的参数绑定问题

FullCalendar会自动给接口带上start和end参数(ISO格式字符串),你需要确认后端能正确解析这些参数:

  • 打开浏览器开发者工具的「网络」面板,查看请求的QueryString,确认参数格式是?start=2024-05-01T00:00:00&end=2024-05-08T00:00:00
  • 如果后端的DateTime?参数绑定失败(比如start/end为null),你的查询条件会返回空结果,自然看不到事件

4. 前端加调试代码,直观查看返回数据

给events配置加上success和error回调,直接在控制台看返回的内容:

var calendar = new FullCalendar.Calendar(calendarEl, {
    plugins: ['interaction', 'dayGrid', 'timeGrid'],
    defaultDate: new Date(),
    defaultView: 'timeGridWeek',
    minTime: '07:00:00',
    maxTime: '22:00:00',
    timeZone: 'local',
    header: {
        left: 'prev,next today',
        center: 'title',
        right: 'timeGridDay,timeGridWeek,dayGridMonth'
    },
    events: {
        url: '/CourseTimetable/GetAllEventsAsJson',
        success: function(data) {
            console.log('拿到的事件数据:', data);
            // 检查data是不是数组,每个元素有没有id、title、start、end字段
        },
        error: function(xhr) {
            console.log('请求失败详情:', xhr.responseText);
        }
    }
});
calendar.render();

如果控制台打印的data是字符串,那就是后端双重序列化的问题;如果是空数组,那就是后端查询逻辑的问题。


5. 关于.NET内置序列化的补充

内置的JsonResult返回的/Date(1567062000000)/格式,FullCalendar v4默认不支持,除非你在前端加日期解析器,但既然Json.Net能解决问题,优先用上面的Json.Net修正方案更省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:20:04