2 Stimmen

FullCalendar zeigt keine Ereignisse an

Ich verwende das FullCalendar jQuery-Plugin von arshaw auf ASP.NET 4. Alles ist in Ordnung, die Ereignisse werden abgerufen, aber sie werden nicht im Kalender angezeigt. Ich bin sicher, dass sie abgeholt werden, FireBug zeigt die Antwort wie diese:

{"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}]}

Ich habe auch versucht, eine Ereignisse Array manuell Serialisierung, aber es funktioniert nicht.

Die Funktion $.ajax() in 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();
                }
            }));

Hier ist mein VB-Code, um die Ereignisse aus der Datenbank zu fecth und geben Sie sie an das Plugin:

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

Klasse beenden

Hat jemand eine Lösung?

Herzlichen Dank.

1voto

nemke Punkte 2400

Hier ist der Haken

anstelle von

events = events || [];

verwenden.

events = events.d || [];

mit dem Parameter d und es wird funktionieren. Wenn Sie wissen wollen, was dieses verrückte d ist, sollten Sie Ihren RSS-Reader mit Encosia Blog. Dieses d wurde in ASP.NET 3.5 eingeführt (es ist nicht in MVC vorhanden, da es ein anderes Framework ist).

Zitat aus seinem Blog :

Dies ist bei allen ASMX-Produkten der Fall. Diensten, die über die JSON-Serialisierung der ASP.NET AJAX-Erweiterungen in ASP.NET 3.5. Selbst wenn Sie nur einen skalaren Rückgabewert zurückgeben, wie z. B. einen String, int oder boolean, wird das Ergebnis immer in einem "d" eingeschlossen. Warum hat sich das geändert? Ich wünschte zwar, dass dieses unerwartete Änderung deutlicher klarer angekündigt worden wäre, aber sie ist gut. Dave Reed hat es mir folgendermaßen erklärt erklärt:

{"d": 1 }

Ist keine gültige JavaSc als dies:

[1] Is.

Daher ist die Umhüllung des " die direkte Ausführung der Zeichenkette als Skript. Kein Objekt oder Array Konstruktor macht Sorgen.

[] ist das Ar von JavaScript Notation, die es Ihnen ermöglicht, ein ein Array zu instanziieren, ohne explizit einen Konstruktor aufzurufen. Zur Erweiterung von Daves Erklärung zu erweitern, betrachten Sie einfach diesen Code: ["Dave", alert("Do Evil"), "Ward"] [ ] führt die Warnung in den meisten Browsern ausführen. Gefahr!

Sie könnten sogar einige Umgehungen vornehmen, damit es sowohl mit ASP.NET 2.0 als auch mit ASP.NET 3.5+ funktioniert

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

Und seit jquery Version 1.5.1 können Sie

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

so dass Sie den Code von fullcallendar.js nicht einmal anfassen müssen

0voto

chobo2 Punkte 79060

Ich bin nicht sicher, was "d" ist und was _type ist, aber so sollte es auf dem Server aussehen

[{"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}]

Ich denke, da Sie das Zeug erst mit "d" und dann mit "_type" umwickelt haben, kann der volle Kalender es wahrscheinlich nicht extrahieren.

0voto

santosh singh Punkte 26504

Prüfen Sie Folgendes

Wie verwendet man Jquery Fullcalender in asp.net

EDIT

Es gibt ein Problem mit dem Fullcalender-Plugin, folgen Sie den Schritten in diese Link und änderte den Plugin-Code entsprechend

0voto

user3794558 Punkte 11

@nemke: Deine Antwort hat mir geholfen, meinen Code zum Laufen zu bringen. Ich danke dir! Ich musste mein Ergebnis aus dem Webdienst allerdings so deserialisieren:

$.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 + ')');
        }
    }
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X