【问题标题】:Full Calendar GetEvents() method call not working完整日历 GetEvents() 方法调用不起作用
【发布时间】:2017-11-28 16:44:41
【问题描述】:

我正在尝试从我的数据库中获取事件,但我无法让它工作。这些事件没有显示在我的日历和 Web 控制台中,我得到:

加载资源失败:服务器响应状态为 500(内部服务器错误)

抛出异常:

参数字典包含“ForecastCalendar.Controllers”中方法“System.Web.Mvc.JsonResult GetEvents(Double, Double)”的不可为空类型“System.Double”的参数“start”的空条目.HomeController'。可选参数必须是引用类型、可空类型或声明为可选参数。 参数名称:参数

这是我的控制器中用于获取事件的方法:

public JsonResult GetEvents(double start, double end)
{
    var events = new List<Event>();

    var dtstart = ConvertFromUnixTimestamp(start);
    var dtend = ConvertFromUnixTimestamp(end);

    DateTime currStart;
    DateTime currEnd;

    foreach (Event ev in db.Events)
    {
        currStart = Convert.ToDateTime(ev.StartDate);
        currEnd = Convert.ToDateTime(ev.EndDate);

        events.Add(new Event()
        {
            ID = ev.ID,
            Title = ev.Title,
            StartDate = currStart,
            EndDate = currEnd,
            AllDay = true,
            EventType = ev.EventType,
            Hours = ev.Hours
        });
    }

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

private static DateTime ConvertFromUnixTimestamp(double timestamp)
{
    var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return origin.AddSeconds(timestamp);
}

下面是我的事件模型:

using System;
using System.ComponentModel.DataAnnotations;

namespace ForecastCalendar.Models
{
    public enum EventType
    {
        BAU,
        Project,
        AnnualLeave
    }

    public class Event
    {
        public int ID { get; set; }

        [Required]
        [DataType(DataType.Date, ErrorMessage = "Please enter a valid date.")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        [Display(Name = "Start Date")]
        public DateTime StartDate { get; set; }

        [Required]
        [DataType(DataType.Date, ErrorMessage = "Please enter a valid date.")]
        [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        [Display(Name = "End Date")]
        public DateTime EndDate { get; set; }

        [Required]
        [StringLength(50, ErrorMessage = "Title cannot be longer than 50 characters.")]
        [RegularExpression(@"^[a-zA-Z- ]+$", ErrorMessage = "Invalid characters used. A-Z or a-z, '-' and ' ' allowed.")]
        [Display(Name = "Title")]
        public string Title { get; set; }

        [Required]
        [EnumDataType(typeof(EventType), ErrorMessage = "Submitted value is not valid.")]
        [Display(Name = "Type")]
        public EventType? EventType { get; set; }

        [Required]
        public double Hours { get; set; }

        [Required]
        public Boolean AllDay { get; set; }

        [Timestamp]
        public byte[] RowVersion { get; set; }

        public virtual Person Person { get; set; }
    }
}

这是呈现日历的 JavaScript。

@{
    ViewBag.Title = "Home Page";
}

@Styles.Render("~/Content/fullcalendar")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/fullcalendar")

<br />
<div class="container">
    <div id="calendar"></div>
</div>
<br />

<script type="text/javascript">
$(document).ready(function () {
    $('#calendar').fullCalendar({
        header: {
            left: 'title',
            center: '',
            right: 'prev,next today' },
        defaultView: 'month',
        weekends: false,
        editable: false,
        events: "/Home/GetEvents/"
    });
});
</script>

非常感谢任何帮助。

编辑:

我已更改我的 GetEvents() 方法以符合完整日历中的事件类型。

public JsonResult GetEvents(double start, double end)
        {
            var fromDate = ConvertFromUnixTimestamp(start);
            var toDate = ConvertFromUnixTimestamp(end);

            var rslt = db.Events;

            List<Event> result = new List<Event>();

            foreach (var item in rslt)
            {
                Event ev = new Event();
                ev.ID = item.ID;
                ev.Title = item.Title;
                ev.Hours = item.Hours;
                ev.StartDate = item.StartDate;
                ev.EndDate = item.EndDate;
                ev.EventType = item.EventType;
                ev.AllDay = ev.AllDay;
            }

            var resultList = result;

            var eventList = from e in resultList
                            select new
                            {
                                id = e.ID,
                                title = e.Title,
                                start = e.StartDate,
                                end = e.EndDate,
                                allDay = e.AllDay
                            };

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

【问题讨论】:

  • 那么抛出​​的异常是什么? Http 500 响应意味着服务器出现问题。
  • 请提供完整的错误信息(附有错误回调),因为错误500通常表示服务器端有东西崩溃。
  • 我已将异常添加到我的 OP 中。
  • 请阅读错误:)。 start 参数为 null 且不能为 null。您应该将其定义为可为空,或者确保表单 javascript 不会将其作为 null/undefined 发送。
  • 是的,我明白这一点,我希望有人能够解释原因。这就是你应该如何定义调用事件的方法我相信但我仍然对整个事情的工作方式感到困惑。

标签: javascript jquery asp.net-mvc entity-framework fullcalendar


【解决方案1】:

检查您在 GetMethods 接收服务器端的参数,该参数具有等待两个 Double 参数的签名,不为空。

此外,您还直接从模型事件对象发送 JSON 对象。然后,在客户端,这个 JSON 对象直接作为源注入到 fullcalendar 中。但是 fullcalendar 需要在文档中命名的属性,所以 starttitle 是强制性属性。

来自fullcalendar doc Event object

'start'

事件开始的日期/时间。必填。

Moment-ish 输入,例如 ISO8601 字符串。在整个 API 中 将成为真正的 Moment 对象。

但是您的 JSON 对象没有 start 属性,而是 StartDate

现在你可以:

  • 更改您的模型以匹配全日历属性。
  • 映射服务器端的属性,因此您返回带有正确名称的 JSON。
  • ...您也可以在客户端映射它们,但基于您当前的代码会很乏味和肮脏

无论如何,请确保在客户端您的对象具有start 属性。

【讨论】:

  • 我明白你的意思,但我认为这不会产生任何影响。然而,你让我想到了。我想我需要映射我的事件以匹配所需的事件标准?
  • 是的,这是另一种可能性。无论您在服务器端还是客户端执行任何操作,fullcalendar 事件对象都必须至少具有 title 和 start 属性。现在,当您执行 return Json(rows, JsonRequestBehavior.AllowGet); 时,它会使用您在模型中的名称创建属性,因此使用 StartDate 而不是 Start。
  • 我按照你说的在上面重命名了它们,但还是不行,所以我认为我所说的映射它们是正确的,但我不知道该怎么做。
  • @JamesLloyd,您能给我们在客户端接收到的 JSON 对象吗?然后我可以准确地指出错误在哪里。无论如何,我已经用进一步的解释更新了我的答案。
  • 我已经更新了我的代码以符合这个,但它仍然不起作用,我将它添加到我的 OP 中。
【解决方案2】:

老问题,但我在遵循一些关于如何实现 GetEvents 方法的教程后遇到了同样的问题。就我而言,当我将日历设置为期望两个像这样的 double 类型的参数时,日历从未命中 GetEvents 方法

public JsonResult GetEvents(double start, double end) 

查看错误时我看到日历尝试调用以下方法:

/GetEvents?start=2013-12-01&end=2014-01-12&_=1386054751381

我的日历的默认视图是“月”。更改我的 GetEvents 方法以期望两个字符串

public JsonResult GetEvents(string start, string end)

瞧,当我刷新页面时,日历会尝试刷新并调用我的 GetEvents 方法。但是,因为您现在处理的是字符串而不是双精度数,所以您还需要更改这部分代码:

var dtstart = ConvertFromUnixTimestamp(start);
var dtend = ConvertFromUnixTimestamp(end);

处理字符串(格式如下:“2013-12-01”)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 2014-12-15
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多