2010-03-18 4 views
1

J'ai du mal à remplir FullCalendar à partir de MVC et je voudrais un peu d'aide sur le sujet s'il vous plaît.Remplissage des événements FullCalendar à partir de MVC

J'ai le code suivant pour mon contrôleur:

Function GetEvents(ByVal [start] As Double, ByVal [end] As Double) As JsonResult 
    Dim sqlConnection As New SqlClient.SqlConnection 

    sqlConnection.ConnectionString = My.Settings.sqlConnection 

    Dim sqlCommand As New SqlClient.SqlCommand 
    sqlCommand.CommandText = "SELECT tripID AS ID, tripName AS Title, DATEDIFF(s, '1970-01-01 00:00:00', dateStart) AS [Start], DATEDIFF(s, '1970-01-01 00:00:00', dateEnd) AS [End] FROM tblTrip WHERE userID=18 AND DateStart IS NOT NULL" 
    sqlCommand.Connection = sqlConnection 

    Dim ds As New DataSet 
    Dim da As New SqlClient.SqlDataAdapter(sqlCommand) 
    da.Fill(ds, "Meetings") 
    sqlConnection.Close() 

    Dim meetings = From c In ds.Tables("Meetings") Select {c.Item("ID"), c.Item("Title"), "False", c.Item("Start"), c.Item("End")} 

    Return Json(meetings.ToArray(), JsonRequestBehavior.AllowGet) 

End Function 

Cela ne fonctionne bien correctement, mais le format qui est retourné est:

[[25, "Amérique du Sud 2008", » Faux ", 1203033600,1227657600], [48," Levant 2009 "," Faux ", 1231804800,1233619200], [49," Amérique du Sud 2009 "," Faux ", 1235433600,1237420800], [50," Italie 2009 "] , "Faux", 1241049600,1256083200], [189, "Levant 2010a", "Faux", 1265414400,1267574400], [195, "Levant 2010a", "Faux", 1262736000,1262736000], [208, "Levant 2010a "," Faux ", 1264982400,1267574400], [209," Levant 2 010a "," Faux ", 1264982400,1265587200], [210," Levant 2010 "," Faux ", 1264982400,1266969600], [211," Levant 2010 b "," Faux ", 1267056000,1267574400], [213, "Amérique du Sud 2010a", "Faux", 1268438400,1269648000], [214, "Levant 2010 c", "Faux", 1266364800,1264118400], [215, "Amérique du Sud 2010a", "Faux", 1268611200,1269648000] , [217, "Amérique du Sud 2010", "Faux", 1268611200,1269561600], [218, "Amérique du Sud 2010 b", "Faux", 1268956800,1269388800], [227, "levant 2010 b", "Faux" , 1265846400,1266192000]]

et cela est tout à fait différent de ce que je l'ai vu sur le poste d'ici: jQuery FullCalendar JSON date issue

(notez l'absence d'informations d'étiquette et accolades)

Quelqu'un peut-il m'expliquer s'il vous plaît ce que je peux faire mal et pourquoi ma sortie n'est pas correctement formatée.

TIA

Répondre

0

Vous ne pouvez pas simplement utiliser la JsonSerializer sur vos objets - comme vous pouvez le voir, ce n'est pas le format exact que FullCalendar exige.

Vous devrez fournir votre propre sérialiseur (converti de C#):

Public Class Meeting 
    Public ID As Integer 
    Public Title As Integer 
    Public Start As DateTime 
    Public [End] As DateTime 
    Public AllDay As Boolean 
End Class 

Public Class MeetingJavaScriptConverter 
    Inherits JavaScriptConverter 
    Private Shared ReadOnly _supportedTypes As Type() = New Type(-1) {GetType(Meeting)} 
    
    Public Overloads Overrides ReadOnly Property SupportedTypes() As IEnumerable(Of Type) 
        Get 
            Return _supportedTypes 
        End Get 
    End Property 
    
    Public Overloads Overrides Function Serialize(ByVal obj As Object, ByVal serializer As JavaScriptSerializer) As IDictionary(Of String, Object) 
        Dim meeting = TryCast(obj, Meeting) 
        If meeting IsNot Nothing Then 
            Dim dictionary = New Dictionary(Of String, Object)() 
            
            dictionary.Add("id", meeting.ID) 
            dictionary.Add("title", meeting.Title) 
            dictionary.Add("start", meeting.Start.ToJson()) 
            dictionary.Add("end", meeting.[End].ToJson()) 
            
            dictionary.Add("allDay", If(meeting.AllDay, "true", "false")) 
            
            Return dictionary 
        End If 
        Return New Dictionary(Of String, Object)() 
    End Function 
    
    Public Overloads Overrides Function Deserialize(ByVal dictionary As IDictionary(Of String, Object), ByVal type As Type, ByVal serializer As JavaScriptSerializer) As Object 
        Throw New NotImplementedException() 
    End Function 
End Class 

Public Module DateTimeExtensionMethods 
    Private Sub New() 
    End Sub 
    <System.Runtime.CompilerServices.Extension> _ 
    Public Function ToJson(ByVal dateTime As DateTime) As String 
        Return dateTime.ToString("s") 
    End Function 
End Module 

Vous pouvez alors l'utiliser comme suit, une fois que vous avez rempli votre liste Meeting de la requête:

Dim serializer As New JavaScriptSerializer() 
serializer.RegisterConverters(New() {New MeetingJavaScriptConverter()}) 
Dim jsonresult As String = serializer.Serialize(meetings.ToArray()) 

(converti en utilisant: http://www.developerfusion.com/tools/convert/csharp-to-vb/)

+0

Ne vous inquiétez pas de la conversion C#, peut le faire. Vraiment vraiment apprécier la réponse rapide et la solution. Un grand merci. – JasonMHirst

+0

Heh c'est ok, converti en utilisant ce site :) J'espère que vous pouvez voir ce que cela fait au résultat JSON - le 'Dictionary ' est vital ici. – Codesleuth

0

léger problème avec le code (peut-être la conversion) ....

Ce:

Private Shared ReadOnly _supportedTypes As Type() = New() {GetType(Meeting)} 

Public Overloads Overrides ReadOnly Property SupportedTypes() As IEnumerable(Of Type) 
    Get 
     Return _supportedTypes 
    End Get 
End Property 

n'est pas acceptable en VB.Net, montrant une erreur sur "= Nouveau()"

Quel serait le bon code soit? J'ai essayé simplement d'avoir "= New Meeting" mais obtenir une erreur de "Valeur de type 'MVC.Meeting' ne peut pas être converti en 'tableau à 1 dimension de System.Type'."

+0

Ahh ce serait parce que c'est un constructeur de tableau en ligne. Vous devrez supprimer le bit '= New() {GetType (Meeting)}' et placer le constructeur du tableau dans le constructeur de la classe. Je vais essayer de modifier ma réponse pour montrer ce que je veux dire. – Codesleuth

+0

Il semble que c'était le convertisseur. La ligne doit apparaître comme Private ReadOnly partagé _supportedTypes As Type() = Nouveau type (-1) {GetType (Meeting)} ', bien que je ne sois pas sûr du' -1'. Je ne connais pas bien VB.NET. – Codesleuth

+0

Encore une fois mes remerciements CodeSleuth, malheureusement encore des problèmes, je vais demander une dernière fois si je peux avoir une copie de la source originale C# que vous avez publié à l'origine et je vais baser la partie MVC du système en C#. Encore une fois, mes sincères remerciements. – JasonMHirst

0

CodeSleuth de la FAO (et toute autre personne ayant besoin de cela).

Grâce à vous, et vous m'avez aidé à «comprendre» le problème, je l'ai maintenant fonctionné.

Mon code est le suivant:

Function GetEvents(ByVal [start] As Double, ByVal [end] As Double) As JsonResult 
    Dim sqlConnection As New SqlClient.SqlConnection 

    sqlConnection.ConnectionString = My.Settings.sqlConnection 

    Dim sqlCommand As New SqlClient.SqlCommand 
    sqlCommand.CommandText = "SELECT tripID AS ID, tripName AS Title, dateStart AS [Start], dateEnd AS [End] FROM tblTrip WHERE userID=18 AND DateStart IS NOT NULL" 
    sqlCommand.Connection = sqlConnection 

    Dim ds As New DataSet 
    Dim da As New SqlClient.SqlDataAdapter(sqlCommand) 
    da.Fill(ds, "Meetings") 
    sqlConnection.Close() 

    Dim meetings = From c In ds.Tables("Meetings") Select {c.Item("ID"), c.Item("Title"), "False", c.Item("Start"), c.Item("End"), "False"} 

    Dim meetingsArray As New ArrayList() 

    For Each dr As DataRow In ds.Tables("Meetings").Rows 
     Dim m As New Meeting 
     With m 
      .AllDay = False 
      .End = CDate(dr.Item("End")).ToJson() 
      .ID = dr.Item("ID") 
      .Start = CDate(dr.Item("Start")).ToJson() 
      .Title = dr.Item("Title") 
     End With 
     meetingsArray.Add(m) 
    Next 

    Return Json(meetingsArray, JsonRequestBehavior.AllowGet) 


End Function 

et la définition de classe suivante:

Public Class Meeting 
Public id As Integer 
Public title As String 
Public start As String 
Public [end] As String 
Public allDay As Boolean 

End Class

et la fonction suivante, encore une fois grâce à vous:

Public Module DateTimeExtensionMethods 
Sub New() 
End Sub 
<System.Runtime.CompilerServices.Extension()> _ 
Public Function ToJson(ByVal dateTime As DateTime) As String 
    Return dateTime.ToString("s") 
End Function 

End Module

Cela fonctionne parfaitement, même si j'ai besoin de le modifier légèrement pour lire les résultats de Linq (ou simplement changer la commande SQL pour filtrer). Encore une fois, merci de m'avoir aidé à comprendre le problème, je crois fermement qu'il faut comprendre et maintenant il suffit de copier le code et votre aide a fait cela.

Jason

0

Désolé pour être lent, mais je manqué votre commentaire quand j'ai vérifié brièvement avant.
Voici le code original pour ma réponse:

public class Meeting 
{ 
    public int ID; 
    public int Title; 
    public DateTime Start; 
    public DateTime End; 
    public bool AllDay; 
} 

public class MeetingJavaScriptConverter : JavaScriptConverter 
{ 
    private static readonly Type[] _supportedTypes = new[] { typeof(Meeting) }; 

    public override IEnumerable<Type> SupportedTypes 
    { 
     get { return _supportedTypes; } 
    } 

    public override IDictionary<string, object> Serialize(
     object obj, JavaScriptSerializer serializer) 
    { 
     var meeting = obj as Meeting; 
     if (meeting != null) 
     { 
      var dictionary = new Dictionary<string, object>(); 

      dictionary.Add("id", meeting.ID); 
      dictionary.Add("title", meeting.Title); 
      dictionary.Add("start", meeting.Start.ToJson()); 
      dictionary.Add("end", meeting.End.ToJson()); 

      dictionary.Add("allDay", meeting.AllDay ? "true" : "false"); 

      return dictionary; 
     } 
     return new Dictionary<string, object>(); 
    } 

    public override object Deserialize(IDictionary<string, object> dictionary, 
     Type type, JavaScriptSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public static class DateTimeExtensionMethods 
{ 
    public static string ToJson(this DateTime dateTime) 
    { 
     return dateTime.ToString("s"); 
    } 
} 

Et l'utilisation (lorsqu'il est placé dans le Page_Load d'un site Web ASP.NET normal):

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
serializer.RegisterConverters(new[] { new MeetingJavaScriptConverter() }); 
string jsonresult = serializer.Serialize(meetings.ToArray()); 

Response.Clear(); 
Response.ContentType = "text/javascript"; 
Response.Write(jsonresult); 
Response.End(); 

Je collé le code supplémentaire qui montre comment faire fonctionner le Page_Load comme un gestionnaire http parce que c'est ainsi que je l'utilise.

Évidemment, vous n'avez pas besoin d'utiliser la méthode d'extension que j'ai écrite (car c'est juste quelque chose que j'ai écrit parce que j'utilise beaucoup d'autres sérialiseurs Json différents pour lesquels cela a été utile).

Alors voilà. C'est tout mon code, ça fonctionne comme un charme pour moi. Bonne chance! :)

+0

Merde, je viens de remarquer la réponse que vous avez collée. Lol. – Codesleuth

Questions connexes