FullCalendar не показывает события - PullRequest
2 голосов
/ 05 мая 2011

Я использую плагин FullCalendar jQuery от arshaw на ASP.NET 4. Все в порядке, события выбираются, но они не отображаются в календаре. Я уверен, что они получены, FireBug показывает ответ, подобный этому:

{"d":[{"__type":"CalendarioEvento","title":"Samara Dos Santos 
Freitas","start":1304441400,"color":null},
{"__type":"CalendarioEvento","title":"Apae","start":1304443800,"color":null},
{"__type":"CalendarioEvento","title":"Apae","start":1304447400,"color":null},
{"__type":"CalendarioEvento","title":"Samara Dos Santos 
Freitas","start":1304449800,"color":null}]}

Я также попытался сериализовать массив событий вручную, но он не работает.

$ .ajax () в fullcalendar.js:

$.ajax($.extend({}, ajaxDefaults, source, {
                type: "POST",
                data: JSON.stringify(data),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(events) {
                    events = events || [];
                    var res = applyAll(success, this, arguments);
                    if ($.isArray(res)) {
                        events = res;
                    }
                    callback(events);
                },
                error: function() {
                    applyAll(error, this, arguments);
                    callback();
                },
                complete: function() {
                    applyAll(complete, this, arguments);
                    popLoading();
                }
            }));

Вот мой VB-код для извлечения событий из базы данных и возврата их плагину:

Imports System.Web.Services
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration.ConfigurationManager
Imports Newtonsoft.Json

<System.Web.Script.Services.ScriptService()> _
Partial Class _Default
Inherits System.Web.UI.Page

Private Shared Function ToUnixTimespan(ByVal d As DateTime) As Long
    Dim time As New TimeSpan()
    time = d.ToUniversalTime().Subtract(New DateTime(1970, 1, 1, 0, 0, 0))

    Return CType(Math.Truncate(time.TotalSeconds), Int64)
End Function

Private Shared Function FromUnixTimespan(ByVal s As String) As DateTime
    Dim time As DateTime = New DateTime(1970, 1, 1, 0, 0, 0)
    Return time.AddSeconds(s)
End Function

<WebMethod()> _
Public Shared Function ListarEventos(ByVal starte As String, ByVal ende As String) As List(Of CalendarioEvento)
    Dim conexaoSql As New SqlConnection(ConnectionStrings("praeConnectionString").ConnectionString)
    Dim comandoSql As SqlCommand = New SqlCommand("spListarEventosCalendario", conexaoSql)
    comandoSql.CommandType = CommandType.StoredProcedure
    comandoSql.Parameters.AddWithValue("@bitPendentes", 0)
    comandoSql.Parameters.AddWithValue("@agendamentos", "188,135")
    comandoSql.Parameters.AddWithValue("@start", FromUnixTimespan(starte))
    comandoSql.Parameters.AddWithValue("@end", FromUnixTimespan(ende))
    comandoSql.Parameters.AddWithValue("@veiculo", "M01")
    Dim eventos As List(Of CalendarioEvento) = New List(Of CalendarioEvento)
    Try
        conexaoSql.Open()
        Dim sdrEventos As SqlDataReader = comandoSql.ExecuteReader
        While sdrEventos.Read
            Dim evento As New CalendarioEvento
            evento.title = StrConv(sdrEventos("vchNome").ToString, VbStrConv.ProperCase)
            evento.start = ToUnixTimespan(Convert.ToDateTime(sdrEventos("vchData") + " " + sdrEventos("vchHora")))
            eventos.Add(evento)
        End While
    Catch ex As Exception

    Finally
        conexaoSql.Close()
    End Try
    comandoSql.Parameters("@bitPendentes").Value = 1
    Try
        conexaoSql.Open()
        Dim sdrEventos As SqlDataReader = comandoSql.ExecuteReader
        While sdrEventos.Read
            Dim evento As New CalendarioEvento
            evento.title = StrConv(sdrEventos("vchNome").ToString, VbStrConv.ProperCase)
            evento.start = ToUnixTimespan(Convert.ToDateTime(sdrEventos("vchData") + " " + sdrEventos("vchHora")))
            evento.color = "#6AB0D8"
            eventos.Add(evento)
        End While
    Catch ex As Exception

    Finally
        conexaoSql.Close()
    End Try
    Return eventos
End Function

Конечный класс

У кого-нибудь есть решение?

Большое спасибо.

Ответы [ 4 ]

1 голос
/ 06 мая 2011

Вот подвох

вместо

events = events || [];

использование

events = events.d || [];

с параметром d, и он будет работать. Если вы хотите узнать, что это за чёртов d, обновите свой rss reader блогом Encosia . Это d введено в ASP.NET 3.5 (его нет в MVC, потому что это другой фреймворк).

Цитата из его блога :

Это относится ко всем ASMX услуги JSON сериализованы через ASP.NET AJAX Расширения в ASP.NET 3.5. Даже если вы только возвращаете скалярное возвращаемое значение, такое как строка, int, или boolean, результат будет всегда заключать в «д». Зачем это изменилось? Пока я хочу этого неожиданные изменения были более ясно объявлено, это хорошо. Вот как Дейв Рид объяснил это я:

{"d": 1}

Не является допустимым оператором JavaScript, где как это:

[1] Есть.

Итак, перенос параметра "d" предотвращает прямое исполнение Строка как скрипт. Нет объекта или массива конструктор беспокоится.

[] - литерал массива JavaScript нотация, позволяющая вам создать экземпляр массив без явного вызова конструктор. Чтобы расширить на Дейва объяснение, просто учтите это код: ["Dave", alert ("Do Evil"), "Ward"] Это объявление буквенного массива выполнит предупреждение в большинстве браузеры. Опасность!

Вы могли бы даже сделать обходной путь, чтобы он работал как с ASP.NET 2.0, так и с ASP.NET 3.5 +

 if (events.hasOwnProperty('d')){
   events = events.d || [];
 }
 else {
   events = events || [];
 }

А с версии jquery 1.5.1 вы можете использовать

$.ajaxSetup({
            converters: {
            // Evaluate text as a json expression
            "text json": function(data) {
            var res = $.parseJSON(data);
            return res.hasOwnProperty(‘d’) ? res.d : res;
}

так что вам даже не нужно трогать код fullcallendar.js

0 голосов
/ 01 июля 2014

@ nemke: Ваш ответ помог мне заставить мой код работать.Спасибо!Я действительно должен был десериализовать свой результат из веб-службы следующим образом:

$.ajaxSetup({
    converters: {
        // Evaluate text as a json expression
        "text json": function (data) {
            var res = $.parseJSON(data);
            return res.hasOwnProperty('d') ? Sys.Serialization.JavaScriptSerializer.deserialize('(' + res.d + ')') : Sys.Serialization.JavaScriptSerializer.deserialize('(' + res + ')');
        }
    }
});
0 голосов
/ 05 мая 2011

проверьте следующее

Как использовать полный календарь Jquery в asp.net

РЕДАКТИРОВАТЬ

Есть некоторыепроблема в плагине fullcalender. Выполните шаги, указанные в этой ссылке, и измените код плагина соответственно

0 голосов
/ 05 мая 2011

Я не уверен, что такое "d" и что такое _type, но как это должно выглядеть с сервера

[{"id":17667,"title":"Daily - 30days","allDay":false,"start":"6/4/2011 1:00:00 PM","end":"6/4/2011 2:00:00 PM","color":"#C0F8F9","textColor":"#000000","isCustomProperty":true},
{"id":17669,"title":"Test","allDay":true,"start":"6/5/2011 12:00:00 AM","end":"6/5/2011 11:59:00 PM","color":"#C0F8F9","textColor":"#000000","isCustomProperty":true},
{"id":17677,"title":"Weekly - Month","allDay":false,"start":"6/1/2011 1:00:00 PM","end":"6/1/2011 2:00:00 PM","color":"#C0F8F9","textColor":"#000000","isCustomProperty":true}]

Я думаю, что это, вероятно, так как сначала вы завернули материал с помощью "d", а затем полный календарь "_type", вероятно, не можете его извлечь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...