我正在尝试使用最新版本的fullcalendar脚本更新fullcalendar-asp-net项目。该项目使用1.4.7版本的fullcalendar(这是非常古老的)与jquery 1.3.2(也很老)。我喜欢该项目的整个功能,所以我只是想通过jquery 1.10.2将其更新到fullcalendar的1.6.4(最新版本)(最后一个版本随jquery版本一起提供)。
我遇到的问题是,当我更新脚本时,我无法从处理程序中显示事件。我所做的唯一更改是更改页眉上的脚本,如:
所有后端方法都正常工作,所以我可以添加新事件并将它们保存到db并更新它们没有问题。当我重新加载页面时,它们都消失了(意味着它们没有加载)。这是应该在pageload上加载日历的js代码(为了简化,删除了不需要的代码)。
var calendar = $('#calendar').fullCalendar({
events: "JsonResponse.ashx",
})
奇怪的是,当我将json响应直接复制并粘贴到事件时,它们都会出现。代码是这样的:
var calendar = $('#calendar').fullCalendar({
events: [{ id: '42', title: 'asdf', start: 1378771200, end: 1378944000, allDay: true, description: 'asdfasdf' },
{ id: '43', title: 'sadfsdf', start: 1378944000, end: 1379030400, allDay: true, description: 'asdfgadfasdfd' },
{ id: '44', title: 'asdf', start: 1379030400, end: 1379030400, allDay: true, description: 'asdfasdf' }]
})
我开始考虑在fullcalendar的版本1.4.7和1.6.4之间,加载事件应该有所不同。当我查看文档时,我看到的与我完全相同。是不是只是向事件发送JSON字符串?由ashx处理程序生成的JSON字符串是正确的,因此当我直接复制并粘贴它时它会起作用。
我在这里有点迷失,浪费了足够的时间寻找相关信息和阅读基础知识。最后来到这里希望有人能指出我正确的方向。
注意:我没有编写ashx代码,认为它不重要,因为它创建了一个有效的JSON字符串,可以在fullcalendar-asp-net项目中找到它。
谢谢!
答案 0 :(得分:2)
最后,我最终修改了“fullcalendar-asp-net”项目中的原始ashx处理程序。我没有在foreach循环中向字符串添加事件,而是使用此代码创建了一个事件列表并将其转换为Json字符串。
System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
new System.Web.Script.Serialization.JavaScriptSerializer();
string sJSON = oSerializer.Serialize(tasksList);
context.Response.Write(sJSON);
完整的ashx代码是这样的。
/// <summary>
/// Summary description for JsonResponse
/// </summary>
public class JsonResponse : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//CONVERT FROM UTC TIMESTAMP TO LOCAL DATETIME
DateTime start = ConvertFromTimeStamp(long.Parse(context.Request.QueryString["start"]));
DateTime end = ConvertFromTimeStamp(long.Parse(context.Request.QueryString["end"]));
List<int> idList = new List<int>();
List<ImproperCalendarEvent> tasksList = new List<ImproperCalendarEvent>();
//GENERATE JSON SERIALIZABLE EVENTS
foreach (CalendarEvent cevent in EventDAO.getEvents(start, end))
{
tasksList.Add(new ImproperCalendarEvent
{
id = cevent.id,
title = cevent.title,
start = ConvertToTimestamp(Convert.ToDateTime(cevent.start).ToUniversalTime()).ToString(),
end = ConvertToTimestamp(Convert.ToDateTime(cevent.end).ToUniversalTime()).ToString(),
description = cevent.description,
allDay = cevent.allDay,
}
);
idList.Add(cevent.id);
}
context.Session["idList"] = idList;
//SERIALIZE EVENTS TO STRING
System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
new System.Web.Script.Serialization.JavaScriptSerializer();
string sJSON = oSerializer.Serialize(tasksList);
//WRITE JSON TO RESPONSE OBJECT
context.Response.Write(sJSON);
}
/// <summary>
/// Converts a UTC transformed timestamp into a local datetime
/// </summary>
/// <param name="timestamp"></param>
/// <returns></returns>
private DateTime ConvertFromTimeStamp(long timestamp)
{
long ticks = (timestamp * 10000000) + 621355968000000000;
return new DateTime(ticks, DateTimeKind.Utc).ToLocalTime();
}
private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private static long ConvertToTimestamp(DateTime value)
{
TimeSpan elapsedTime = value - Epoch;
return (long)elapsedTime.TotalSeconds;
}
public bool IsReusable
{
get
{
return false;
}
}
}
当我问这个问题时,我使用的是web方法而不是那个处理程序,所以调用日历的js代码与应该的不同。现在,我使用的方法与fullcalendar官方文档中解释的完全相同。等;
$('#calendar').fullCalendar({
events: '/myfeed.php', }); // for me, that is "JsonResponse.ashx"
现在它适用于我在问题中提到的所有脚本的最新版本。 Jquery 1.10.2,Jquery-UI 1.10.3和fullcalendar 1.6.4。它完美无缺!
我希望那些无法解决问题的人不会像我一样受苦:)
谢谢!