完整日历GetEvents()方法调用不起作用

时间:2016-03-04 10:50:47

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

我正在尝试从我的数据库中获取事件,但我无法让它工作。事件没有显示在我的日历和我的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);
        }

2 个答案:

答案 0 :(得分:1)

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

此外,您将直接从Model Event对象发送JSON对象。然后,在客户端,这个JSON对象直接作为fullcalendar中的源注入。但是fullcalendar期望在文档中命名为属性,因此starttitle是必需属性。

来自fullcalendar doc Event object

'start'
  

活动开始的日期/时间。必需的。

     

Moment-ish输入,类似于ISO8601字符串。整个API这个   将成为真正的Moment对象。

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

现在你可以:

  • 更改模型以匹配fullcalendar属性。
  • 将服务器端映射到属性,以便返回具有正确名称的JSON。
  • ...您也可以将它们映射到客户端,但根据您当前的代码会很乏味和肮脏

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

答案 1 :(得分:0)

老问题,但是在按照一些关于如何实现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)

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

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

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