我正在使用ASP.Net,C#和javascript库“jQuery full calendar”构建一个Intranet站点。我根据文档有基本要求,但我认为我可能要么脚本乱序,要么在日历渲染时丢失了某些内容,但没有显示列出的事件。我特意在寻找假日活动,就像我们在谷歌日历上一样。
下面是我母版页中的一些相关代码,如有必要,我可以包含整个母版页。
<link rel='stylesheet' href='Content/fullcalendar.css' />
<link rel='stylesheet' href='Content/fullcalendar.print.css' />
<link rel="stylesheet" href="Content/jquery-ui.css"/>
<script src='Scripts/moment.min.js'></script>
<script src='Scripts/jquery.min.js'></script>
<script src="Scripts/jquery-ui.js"></script>
<script src='Scripts/gcal.js'></script>
<script src='Scripts/fullcalendar.js'></script>
<script src='Scripts/Site.js'></script>
<script type='text/javascript'>
$(document).ready(function() {
$('#calendar').fullCalendar({
theme: true,
editable: true,
disableDragging: true,
disableResizing: true,
header: {
left: 'prev,next today',
center: 'title',
right: 'month,basicWeek,basicDay'
},
googleCalendarApiKey: 'my api key',
events: function(start, end, callback) {
// do some asynchronous ajax
contentType:"application/json; charset=utf-8",
$.getJSON("/outlookHolidayCalendar2018.JSON",
{
start: dateFormat(start.getTime()),
end: dateFormat(end.getTime())
},
function(result) {
if(result != null)
{
for (i in result) {
var calEvent = result[i];
//calEvent.date = new Date(parseInt(calEvent.date.replace("/Date(", "").replace(")/", ""), 10));
//calEvent.start = new Date(parseInt(calEvent.start.replace("/Date(", "").replace(")/", ""), 10));
//calEvent.end = new Date(parseInt(calEvent.end.replace("/Date(", "").replace(")/", ""), 10));
title: result.Subject;
start: result.StartDate.format();
end: result.EndDate.format()
}
}
else {
alert('there was an error while fetching JSON events!');
}
var calevents = result;
// then, pass the CalEvent array to the callback
callback(calevents);
});
},
eventClick : function(event) {
editEventShow(event);
},
dayClick : function(dayDate){
addEventShow(dayDate, this);
}
});
});
</script>
我的“日历”页面看起来像这样。
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<%-- using fullcalendar from https://fullcalendar.io/docs/intro --%>
<div id='calendar'></div>
下面是我的JSON文件中的示例
{
"Subject": "Easter Day",
"StartDate": "4/1/2018",
"StartTime": "12:00:00 AM",
"EndDate": "4/2/2018",
"EndTime": "12:00:00 AM",
"All_day_event": "TRUE",
"Reminder_on_off": "FALSE",
"ReminderDate": "3/31/2018",
"ReminderTime": "11:45:00 PM",
"MeetingOrganizer": "",
"RequiredAttendees": "",
"OptionalAttendees": "",
"MeetingResources": "",
"BillingInformation": "",
"Categories": "",
"Description": "",
"Location": "United States",
"Mileage": "",
"Priority": "Normal",
"Private": "FALSE",
"Sensitivity": "Normal",
"Show_time_as": 3
},
你们中的任何人都可以帮助我吗?
如果你在浏览器的控制台中查看,我预计你会有一两个错误。
title: result.Subject;
start: result.StartDate.format();
end: result.EndDate.format()
是错的 - 它没有做任何有用的事情。我看到你正在尝试做什么(即设置与fullCalendar的预期事件结构匹配的字段名称),但为此,你需要实际创建一个对象。
不幸的是,通过编写var calevents = result;
然后完成了这个问题 - 所以你只需将原始整个结果数组放入calEvents中,忽略所有处理它以满足fullCalendar预期的尝试。
然后有StartDate.format()
......
为什么这是个问题?因为您的数据是从您的JSON解析的。在你的JSON中,StartDate
和EndDate
是字符串(代表日期,但仍然是字符串)。因此,在你的result
数组中,它们仍然是字符串。字符串没有format()
方法。您的代码会因此而崩溃(除了所有其他问题!)。
FullCalendar(使用momentJS处理日期)可以通过多种方式接受日期(有关详细信息,请参阅https://fullcalendar.io/docs/moment和https://momentjs.com/docs/#/parsing/string/)。
它可以接受日期作为字符串,但不能以您提供的格式接受 - 这是不明确的。 “4/1/2018”可能是4月1日或1月4日,具体取决于您的阅读方式 - 通常您的阅读方式取决于您所居住国家/地区的惯例。然而,计算机无法确定您打算使用哪一台,除非您说出来。
所以,你有两个选择:
选项1)
如果您因任何原因无法/不会更改JSON源数据,则必须创建一个事件对象(或修改现有对象),该对象具有与fullCalendar匹配的字段名称和格式。您需要设置正确的属性,并使用momentJS来解析日期,如果您告诉它日期所在的格式:
events: function(start, end, callback) {
// do some asynchronous ajax
$.getJSON("/outlookHolidayCalendar2018.JSON", function(result) {
for (i = 0; i < result.length; i++) {
result[i].title = result[i].Subject;
result[i].start = moment(result[i].StartDate, "MM/DD/YYYY");
result[i].end = moment(result[i].EndDate, "MM/DD/YYYY")
}
callback(result);
});
},
笔记:
一个。 fullCalendar可以接受momentJS对象作为输入,因此不需要使用.format()
将其再次更改为字符串。
湾你的for
语法是完全错误的 - 这是迭代对象proeprties的语法,而不是数组索引。 result
是整个阵列,而不是单个项目。
C。 if
声明有点多余。返回没有结果并不表示错误,它只表示没有结果。如果没有结果,则日历上不会显示任何事件,这就是全部。这不是错误或错误。
d。在$ .getJSON请求中发送“start”和“end”参数是没用的,因为您正在访问静态JSON文件。发送这些参数仅在您将请求发送到服务器端脚本时才有用,该脚本可以处理它们并使用它们来限制返回到fullCalendar的数据范围。因此我从他的例子中删除了它们。
选项2)
更清晰的选项是更改您的JSON,以便以明确的格式输出日期字符串。 fullCalendar和momentJS接受国际标准IS0-8601格式的日期字符串,日期部分采用YYYY-MM-DD
格式,例如2018-04-01
。此时,将日期和时间字段合并为一个也是明智的,因为fullCalendar将读取开始和结束的单个日期/时间字符串。然后你不必在以后组合它们。您给出的示例被标记为全天事件,因此不适用,但这将是其他事件要遵循的模式。
事实上,如果你对JSON进行小规模的改造,你可以将它变成一个你根本不需要使用JavaScript处理它的状态,并且可以直接将它直接传递给fullCalendar。
在JSON中写一个事件,如下所示:
{
"title": "Easter Day",
"start": "2018-04-01",
"end": "2018-04-02",
"allDay": true,
"Reminder_on_off": false,
"ReminderDate": "2018-03-31 23:45:00",
"MeetingOrganizer": "",
"RequiredAttendees": "",
"OptionalAttendees": "",
"MeetingResources": "",
"BillingInformation": "",
"Categories": "",
"Description": "",
"Location": "United States",
"Mileage": "",
"Priority": "Normal",
"Private": false,
"Sensitivity": "Normal",
"Show_time_as": 3
},
然后在你的JavaScript中你可以简单地写:
events: "/outlookHolidayCalendar2018.JSON"
并删除整个函数,因为title,start,end和allDay字段的字段名称和格式与fullCalendar所期望的一样(参见https://fullcalendar.io/docs/event-object)。
附:您的“googleCalendarAPIKey”选项和“contentType”行也似乎都是多余的。第一个是无用的,因为你没有在你的代码中访问谷歌日历,第二个只是没有去任何地方,它只是声明(不正确地,好像它是一个对象属性),然后被丢弃。您也可以删除gcal.js
脚本,因为它仅用于从Google日历下载。
基于这一切,我认为您现在需要做的最重要的事情是更详细地学习JavaScript语法,并学习如何使用浏览器的开发人员工具(包含控制台和其他工具)来调试程序并查找错误。