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
相关产品推荐
相关产品推荐

