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

Asp.net Core Razor Pages中FullCalendar无法显示数据问题排查

搞定Asp.net Core Razor Pages的FullCalendar:解决事件不显示+实现日期点击录入功能

嘿,我来帮你解决这个FullCalendar的问题!我之前在Razor Pages里折腾过这个插件,踩过不少坑,咱们一步步来搞定~

一、先解决事件不显示的问题(从控制台报错入手)

控制台报错是定位问题的核心,先把这个搞定,事件才能正常显示。常见的坑和解决方法:

1. 数据接口返回异常(404/500)

如果控制台显示请求事件数据的接口返回404或者500,先检查后台的handler路由和返回格式:

  • 在Index.cshtml.cs里,你的事件数据接口(比如OnGetEvents)要符合Razor Pages handler格式,前端请求地址应该是/Index?handler=Events。给你个示例后台代码:
public JsonResult OnGetEvents()
{
    // 先模拟测试数据,确保格式符合FullCalendar要求
    var testEvents = new List<Calendar>
    {
        new Calendar
        {
            Id = 1,
            Title = "我的测试事件",
            Start = DateTime.Now.ToString("yyyy-MM-dd"),
            End = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"),
            AllDay = true
        }
    };
    return new JsonResult(testEvents);
}
  • 再检查Calendar.cs的实体类,必须包含FullCalendar必填字段:Id、Title、Start,可选的End、AllDay等字段名要和前端对应,别写错!

2. FullCalendar初始化配置错误

看看index.cshtml里的初始化代码,events配置必须正确指向后台handler:

<script>
document.addEventListener('DOMContentLoaded', function() {
    const calendarEl = document.getElementById('calendar');
    const calendar = new FullCalendar.Calendar(calendarEl, {
        initialView: 'dayGridMonth',
        headerToolbar: {
            left: 'prev,next today',
            center: 'title',
            right: 'dayGridMonth,timeGridWeek,timeGridDay'
        },
        // 重点:这里的地址要和后台handler对应
        events: '/Index?handler=Events',
        // 其他配置...
    });
    calendar.render();
});
</script>

如果控制台报FullCalendar is not defined,那就是你没正确引入FullCalendar的JS/CSS,赶紧补上:

<!-- 先引入FullCalendar样式 -->
<link href="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.8/main.min.css" rel="stylesheet">
<!-- 再引入FullCalendar脚本 -->
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.8/main.min.js"></script>

3. 其他小细节

如果遇到跨域报错(Razor Pages同域一般不会,但万一用了独立API),可以在Program.cs中添加CORS配置,但这种情况比较少见。

二、实现点击日期弹出对话框录入事件

搞定显示问题后,咱们来做添加事件的功能,用Bootstrap模态框最方便,步骤如下:

1. 添加模态框HTML

在index.cshtml里插入模态框代码,用来录入事件信息:

<!-- 添加事件的模态框 -->
<div class="modal fade" id="addEventModal" tabindex="-1" aria-labelledby="addEventModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="addEventModalLabel">添加新事件</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <form id="addEventForm">
        <div class="modal-body">
          <div class="mb-3">
            <label for="eventTitle" class="form-label">事件标题</label>
            <input type="text" class="form-control" id="eventTitle" required>
          </div>
          <div class="mb-3">
            <label for="eventStart" class="form-label">开始日期</label>
            <input type="date" class="form-control" id="eventStart" required>
          </div>
          <div class="mb-3">
            <label for="eventEnd" class="form-label">结束日期(可选)</label>
            <input type="date" class="form-control" id="eventEnd">
          </div>
          <div class="mb-3">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" id="eventAllDay">
              <label class="form-check-label" for="eventAllDay">全天事件</label>
            </div>
          </div>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
          <button type="submit" class="btn btn-primary">保存事件</button>
        </div>
      </form>
    </div>
  </div>
</div>

记得要引入Bootstrap的JS和CSS,不然模态框无法正常工作!

2. 给FullCalendar添加日期点击事件

修改FullCalendar初始化代码,加上dateClick回调,点击日期时自动填充开始日期并弹出模态框:

<script>
document.addEventListener('DOMContentLoaded', function() {
    const calendarEl = document.getElementById('calendar');
    const calendar = new FullCalendar.Calendar(calendarEl, {
        initialView: 'dayGridMonth',
        headerToolbar: {
            left: 'prev,next today',
            center: 'title',
            right: 'dayGridMonth,timeGridWeek,timeGridDay'
        },
        events: '/Index?handler=Events',
        // 点击日期触发的回调
        dateClick: function(info) {
            // 把点击的日期填充到开始日期输入框
            document.getElementById('eventStart').value = info.dateStr;
            // 弹出模态框
            const modal = new bootstrap.Modal(document.getElementById('addEventModal'));
            modal.show();
        }
    });
    calendar.render();

    // 处理表单提交,保存事件
    document.getElementById('addEventForm').addEventListener('submit', function(e) {
        e.preventDefault();
        // 收集表单数据
        const eventData = {
            Title: document.getElementById('eventTitle').value,
            Start: document.getElementById('eventStart').value,
            End: document.getElementById('eventEnd').value || null,
            AllDay: document.getElementById('eventAllDay').checked
        };
        // 发送POST请求到后台保存
        fetch('/Index?handler=AddEvent', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                // 别忘了加Razor Pages的防伪令牌
                'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value
            },
            body: JSON.stringify(eventData)
        })
        .then(res => res.json())
        .then(data => {
            // 关闭模态框
            const modal = bootstrap.Modal.getInstance(document.getElementById('addEventModal'));
            modal.hide();
            // 重新加载日历事件,显示新添加的内容
            calendar.refetchEvents();
            alert('事件添加成功啦!');
        })
        .catch(err => {
            console.error('添加失败:', err);
            alert('添加失败,请重试!');
        });
    });
});
</script>

3. 后台添加保存事件的Handler

在Index.cshtml.cs里添加OnPostAddEvent方法,接收前端请求并保存事件:

// 用[FromBody]接收JSON格式的事件数据
public async Task<IActionResult> OnPostAddEvent([FromBody] Calendar newEvent)
{
    if (ModelState.IsValid)
    {
        // 这里替换成你的数据库操作逻辑,比如用EF Core保存到数据库
        // _context.Calendars.Add(newEvent);
        // await _context.SaveChangesAsync();
        return new JsonResult(new { success = true, @event = newEvent });
    }
    return new JsonResult(new { success = false, message = "输入的数据有问题哦" });
}

Calendar.cs实体类要和前端提交的字段对应:

public class Calendar
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Start { get; set; }
    public string End { get; set; }
    public bool AllDay { get; set; }
}

三、最后检查这些关键点

  • 确保Bootstrap的JS/CSS已正确引入,否则模态框无法正常使用。
  • 打开浏览器Network标签,查看事件请求和保存请求的返回状态,排查接口异常。
  • 日期格式统一使用yyyy-MM-dd,FullCalendar对该格式兼容性最好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:27:45