【问题标题】:fullCalendar: Getting data from controller JSONfullCalendar:从控制器 JSON 获取数据
【发布时间】:2017-06-05 20:57:46
【问题描述】:

我在 Visual Studio 2015 中使用 fullCalendar 库。我无法从 AJAX 命令填充事件。日历上没有任何事件。如果我只传递一个日期时间并设置 allDay = true,它将填充事件。我还需要它与时间一起工作,并且每天进行多个事件。

JS代码:

$(document).ready(function () {

$(".calendar").fullCalendar
    ({
        header: {
            left: 'month,basicWeek,basicDay,today',
            center: 'title',
            right: 'prev,next'
        },
        weekends: false,
        eventLimit: true,
        theme: true,
        editable: false,
        fixedWeekCount: false,
        events: function(start, end, timezone, callback)
        {$.ajax
            ({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "/Calendar/GetCalendarEvents",
                dataType: 'json',
                success: function (data)
                {

                    var events = [];
                    $.each(data, function (index, value) {

                        events.push({
                            id: value['id'],
                            title: value['title'],
                            date: value['date']
                            //all data
                        });
                        console.log(value)
                    });
                    callback(events);
                },
                error: function (xhr, err) {
                    alert("ERROR! - readyState: " + xhr.readyState + "<br/>status: " + xhr.status + "<br/>responseText: " + xhr.responseText);
                }
            });

        }   });})

注意:上面的代码是让它工作的可能尝试之一。我之前尝试过以不同的方式对其进行编码。

控制器代码:

public ActionResult GetCalendarEvents()
    {
        var events = new List<VMCalendarEvents>();
        var db_events = db.PatientVisits.ToList();
        foreach(var e in db_events)
        {
            DateTime visit_start = Convert.ToDateTime(e.VisitStart);
            DateTime visit_end = Convert.ToDateTime(e.VisitEnd);

            var calEvent = new VMCalendarEvents
            {
                id = e.PatientVisitID.ToString(),
                title = "Placeholder Title" + e.PatientVisitID.ToString(),
                date = visit_start.ToShortDateString(),
                start = visit_start.ToString(),
                end = visit_end.ToString(),
                editable = true,
                allDay = false

            };
            events.Add(calEvent);
        }

        var rows = events.ToArray();
        return Json(rows, JsonRequestBehavior.AllowGet);}

Controller Code Output

JS Objects from Controller

编辑:问题已解决

所以经过一番调查后,我决定在 MVC 中使用 Razor 来解决这个问题。我没有将其写入单独的 JS 文件,而是将其放入 html 文件的标题中。通过实现下面的代码,我能够以 (yyyy-MM-ddTHH:dd & MM/dd/yyyy hh:mm tt) 的日期格式获取对象:

    $(function () {

    $('#calendar').fullCalendar({
        header: {
            left: 'prev,next today',
            center: 'title',
            right: 'month,agendaWeek,agendaDay'
        },
        defaultDate: '2017-06-12',
        editable: true,
        events: '@Url.Action("GetCalendarEvents", "Calendar")',

    });

});

我使用 URL Action 命令调用了控制器并将 JSON 数据作为 ActionResult 返回。

【问题讨论】:

  • 你的`$.each`循环有什么意义?在我看来,来自控制器的数据已经是正确的格式,无需翻译。你可以只做callback(data) 没有任何中间步骤。此外,您的控制器应该接受“开始”和“结束”参数,并且只返回当前显示日期的数据,否则每次用户转到新日期或日历中的视图时,它都会下载 all 你的事件一次又一次,效率很低。
  • 就日期而言,您最好以 ISO 格式输出日期,以避免格式不明确或国际化的任何问题。目前看起来它们可能采用美国 M/D/Y 格式,但在这种情况下,fullCalendar 将不知道“05/03/2017”是 5 月 3 日还是 3 月 5 日。 YYYY-MM-DD 是明确的。可能是日历错误地解释了某些日期,甚至因为不理解它们而失败 - 您在加载事件时检查了浏览器控制台是否有错误或警告?

标签: javascript c# json fullcalendar


【解决方案1】:

Fullcalendar 可能不喜欢日期字段中的斜杠“/”。请尝试使用连字符“-”。 文档 (https://fullcalendar.io/docs/utilities/Moment/) 更详细地说明了日期/时间的工作格式。

作为参考,这是我使用来自 AJAX 的 JSON 的完整日历代码(请注意,我的事件没有结束时间,但这是自愿选择的):

{
    $.ajax({
        url: 'example.json',
        dataType: 'json',
        success: function(doc) {
            var events = [];
            $.each(doc, function(index, element) {
                events.push({
                    title: element.title,
                    start: element.time,
        url: element.url,

                });
            });
            callback(events);
        }
    }) //ajax
    }

还有 JSON 文件(example.json):

    [
{"time": "2017-06-06 09:00:00", "title": "Get It Done in June ", "url": "http://example.org"},
{"time": "2017-06-07 14:00:00", "title": "Fighting Imposter Syndrome for Dissertating Students ", "url": "http://example.com"},
{"time": "2017-06-14 14:00:00", "title": "Entering into the Academic Conversation", "url": "http://example.biz"}
]

【讨论】:

  • 我的代码工作正常。您的解决方案似乎有所帮助,但经过一些调整后,我让它在没有 AJAX 的情况下工作。我将在上面发布解决方案。感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多