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日」)