在ajax结果中的完整日历显示空白

时间:2017-09-22 04:36:06

标签: c# jquery json ajax fullcalendar

可能这是一个重复的问题,但对我来说没办法。 单击完整日历中的上一个和下一个按钮时,我必须显示值。我正在使用ajax和值正确返回在控制台中可见。现在我有两个问题

  1. 我的日历中未显示数据
  2. 我想通过当月的第一天,然后才能访问当月的数据。我知道事件有默认的开始和结束值。但我需要特定月份的第一个日期
  3. 当我点击这些按钮时,WebMethod总是会点击。 这是我的控制台中的结果。

    Array(6)
    0
    :
    {EventID: "00000000-0000-0000-0000-000000000000", EventName: "Presnt", StartDate: "01-08-2017", EndDate: null, ImageType: 0, …}
    1
    :
    {EventID: "00000000-0000-0000-0000-000000000000", EventName: "Presnt", StartDate: "02-08-2017", EndDate: null, ImageType: 0, …}
    2
    :
    {EventID: "00000000-0000-0000-0000-000000000000", EventName: "Presnt", StartDate: "03-08-2017", EndDate: null, ImageType: 0, …}
    3
    :
    {EventID: "00000000-0000-0000-0000-000000000000", EventName: "Presnt", StartDate: "04-08-2017", EndDate: null, ImageType: 0, …}
    4
    :
    {EventID: "00000000-0000-0000-0000-000000000000", EventName: "Presnt", StartDate: "07-08-2017", EndDate: null, ImageType: 0, …}
    5
    :
    {EventID: "00000000-0000-0000-0000-000000000000", EventName: "Presnt", StartDate: "08-08-2017", EndDate: null, ImageType: 0, …}
    length
    :
    6
    

    Jquery的

     $(document).ready(function () {
            $('div[id*=calendar1]').show();
            $('div[id*=calendar1]').fullCalendar({
                header: {
                    left: 'prev,next today',
                    center: 'title',
                    right: 'month,agendaWeek,agendaDay'
                },
                events: function (start, end,timezone, callback) {
                    $.ajax({
                        type: "POST",
                        contentType: "application/json",
                        data: "{Start:'" + start + "',End:'" + end + "'}",
                        url: "attendance-full.aspx/GetEvents",
                        dataType: "json",
                         // Old Code
                            //success: function (data) {
                            //    console.log(data);
                            //    for (var i = 0; i < data.d.length; i++) {
                            //        var event = new Object();
                            //        event.id = data.d[i].EventName;
                            //        event.start = new Date(data.d[i].StartDate);
                            //        event.title = data.d[i].EventName;
                            //        return event;
                            //    }
                            //}
                            //New Code
                            success: function (doc) {
                                console.log(doc);
                                var my_events = [];
                                if (!doc.result) {
                                    $.each(doc.d, function (index, elem) {
                                        my_events.push({
                                            id:elem.EventName,
                                            title: elem.EventName,
                                            start: elem.StartDate,
                                        });
    
                                    });
                                    callback(my_events);
                                }
                            }
                    });
                }
            });
            $('#loading').hide();
            $('div[id*=fullcal]').show();
        });
    

    背后的代码

    [WebMethod]
    public static IList GetEvents(string Start, string End)
    {
        String Date = "10/01/2016";
        IList events = new List<Event>();
        //Hard coded the date for testing yyyy-MM-dd
        DateTime startDate = Convert.ToDateTime("2017-08-01");//Convert.ToDateTime(Date);
        DateTime endDate = Convert.ToDateTime("2017-08-31");//StartDate.AddMonths(1);
        SqlConnection con1 = new SqlConnection(Connection.str);
        BLL_Attentance Att = new BLL_Attentance();
        DataSet ds = new DataSet();
        double OS_Idno = 2587470;
        string AccYear = "2017-2018";
        try
        {
            DataTable dt = Att.AttentanceLoadFull(Convert.ToDouble(1236), 3, startDate.ToString(), endDate.ToString(), AccYear);//OP_sp_Attendance_Load
            ds.Tables.Add(dt);
        }
        catch (Exception ex)
        {
            ex.Message.ToString();
        }
    
        for (DateTime i = startDate; i < endDate; i = i.AddDays(1))
        {
            if (ds.Tables[0].Rows.Count > 0)
            {
                // to check ds contains the current date
                DataRow[] Date1 = ds.Tables[0].Select("OSA_Dateofattendance = '" + i + "'");
                if (Date1.Count() == 0)
                {
    
                }
                else
                {
                    string flag = "Present";
                    /*New Code*/
                    DataTable ds3 = new DataTable();
                    string sub = "2017-2018".Substring(0, 4);
                    string OS_Attendance = "OS_Attendance" + sub;
                    SqlDataAdapter sda3 = new SqlDataAdapter("select Oid from " + OS_Attendance.ToString() + " where Oattn_date='" + i.ToString("MM-dd-yyyy") + "' and M_idno='" + 3 + "' and Oattn_acadyear='2017-2018' and  Os_idno='" + OS_Idno + "'", con1);
                    sda3.Fill(ds3);
                    /*New Code End*/
    
                    if (ds3.Rows.Count > 0)
                    {
                        flag = "Absent";
                    }
                    if (flag == "Absent")
                    {
                        events.Add(new Event
                        {
                            EventName = "Absent",
                            StartDate = i.ToString("dd-MM-yyyy"),
                        });
                    }
                    else
                    {
                        events.Add(new Event
                        {
                            EventName = "Presnt",
                            StartDate = i.ToString("dd-MM-yyyy"),
                        });
    
                    }
                }
            }
        }
        return events;
    
    }
    
    public class Event
    {
        public Guid EventID { get { return new Guid(); } }
        public string EventName { get; set; }
        public string StartDate { get; set; }
        public string EndDate { get; set; }
        public int ImageType { get; set; }
        public string Url { get; set; }
    }
    

    此处结果仅显示2017-08-01和2017-08-31之间的数据。 2017年8月未显示任何数据。请帮帮我

    已修改

    我更改了我的ajax代码,它将指定为新代码,然后是日历显示 2017年7月7日的单一日期没有显示其他日期 Click the link to view my result。 在控制台中找到错误

    moment.min.js:6 Deprecation warning: moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.
    Error
        at $ (http://localhost:4047/assets/global/plugins/moment.min.js:6:6788)
        at http://localhost:4047/assets/global/plugins/moment.min.js:6:25765
        at http://localhost:4047/assets/global/plugins/moment.min.js:6:145
        at http://localhost:4047/assets/global/plugins/moment.min.js:6:149
    

1 个答案:

答案 0 :(得分:2)

在你的ajax函数结束时,你不是通过提供的回调将数据发送到fullCalendar,而是在你读完一个单独的事件后从函数返回。删除“return”语句,并添加对回调函数的调用:

success: function (data) {
  console.log(data);
  for (var i = 0; i < data.d.length; i++) {
    var event = new Object();
    event.id = data.d[i].EventName;
    event.start = new Date(data.d[i].StartDate);
    event.title = data.d[i].EventName;
  }
  callback(data);
}

这是根据以下示例:https://fullcalendar.io/docs/event_data/events_function/

至于你的第二点 - 那不是fullCalendar的工作方式。您的服务器方法需要足够灵活,以接受任何给定的开始/结束日期。这是因为除了“月”之外还有其他视图类型,包括您可以在某些议程和列表视图中完全自定义显示的日期(例如2周,3 1/2周,无论您喜欢什么)。因此,默认情况下,该方法会提供应返回的事件的确切日期范围。

查看您的查询,您有一个出勤日期字段,因此您应该能够使用<>使用单个SQL语句以及从中传入的开始/结束日期fullCalendar获取事件记录。目前尚不清楚为什么你需要月份数,或者为什么要进行循环并为范围内的每个日期运行i个单独的查询 - 这可能效率很低。您的数据结构看起来也很可疑 - 您似乎每个学年都有单独的表格?如果是这样,这将严重降低标准化,并且在精心设计的数据库中也不一定非必要。只是要考虑一些事情。