我正在尝试从我的数据库中获取事件,但我无法让它工作。事件没有显示在我的日历和我的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);
}
答案 0 :(得分:1)
检查GetMethods接收服务器端的参数,该签名等待两个Double参数,不为空。
此外,您将直接从Model Event对象发送JSON对象。然后,在客户端,这个JSON对象直接作为fullcalendar中的源注入。但是fullcalendar期望在文档中命名为属性,因此start
和title
是必需属性。
来自fullcalendar doc Event object
'start'
活动开始的日期/时间。必需的。
Moment-ish输入,类似于ISO8601字符串。整个API这个 将成为真正的Moment对象。
但是您的JSON对象没有start
属性,但是StartDate
。
现在你可以:
无论如何,请确保在客户端,您的对象具有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”)