1

我试图从我的数据库中获取事件,但我无法让它工作。该事件不显示在我的日历,在我的Web控制台,我得到:完整日历GetEvents()方法调用不工作

无法加载资源:服务器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

那么抛出什么异常呢? Http 500响应意味着服务器出现问题。 –

+0

请提供完整的错误信息(它附带有错误回调),因为错误500通常意味着服务器端的东西被压坏。 – DonCziken

+0

我已将例外添加到我的OP中。 – James

回答

1

检查你在收到的getMethods服务器端的参数,即有一个签名等了双参数,不为null。

另外,您直接从模型事件对象发送JSON对象。然后,在客户端,这个JSON对象直接作为fullcalendar的源注入。但fullcalendar期望获得在文档中命名的属性,因此starttitle是强制属性。

fullcalendar doc Event object

'start' 

的日期/时间的事件开始。需要。

一个矩形输入,就像一个ISO8601字符串。在整个API中,这个 将成为一个真正的Moment对象。

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

现在,您可以:

  • 更改模型相匹配的fullcalendar性能。
  • 地图服务器端的属性,所以你返回的JSON与专有名称。
  • ...你也可以将它们映射的客户端,但根据当前的代码将是乏味和肮脏

无论如何,可以肯定的是,在客户端你有你的对象与start财产。

+0

我明白你的意思,但我不认为这会有什么不同。但是,你让我思考。我想我需要映射我的事件以匹配所需的事件标准? – James

+0

是的,那是另一种可能性。无论您做什么,服务器或客户端,fullcalendar事件对象都必须至少具有标题和启动属性。现在,当您执行'返回Json(行,JsonRequestBehavior.AllowGet);'它将使用模型中的名称创建属性,因此StartDate代替Start。 –

+0

我按照你的说法重新命名了它们,它仍然不起作用,所以我认为我所说的关于映射它们是正确的,但我不知道如何去做。 – James

0

旧的问题,但我已经遇到了一些关于如何实现GetEvents方法的教程后遇到同样的问题。在我结束日历从来没有击中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月1日”)