Заполнение событий FullCalendar из MVC - PullRequest
1 голос
/ 18 марта 2010

У меня проблемы с заполнением FullCalendar из MVC, и я хотел бы получить небольшую помощь по этому вопросу, пожалуйста.

У меня есть следующий код для моего контроллера:

    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

Это действительно работает правильно, но формат, который возвращается:

[[25, «Южная Америка 2008», «Ложь», 1203033600,1227657600], [48, «Левант 2009», «Ложь», 1231804800,1233619200], [49, «Южная Америка 2009», «Ложь» ", 1235433600,1237420800], [50," Italy 2009 "," False ", 1241049600,1256083200], [189," Levant 2010a "," False ", 1265414400,1267574400], [195," Levant 2010a "," False ", 1262736000,1262736000], [208," Levant 2010a "," False ", 1264982400,1267574400], [209," Levant 2010a "," False ", 1264982400,1265587200], [210," Levant 2010 ", "False", 1264982400,1266969600], [211, "Levant 2010 b", "False", 1267056000,1267574400], [213, "South America 2010a", "False", 1268438400,1269648000], [214, "Levant" 2010 c "," False ", 1266364800,1264118400], [215," South America 2010a "," False ", 1268611200,1269648000], [217," South America 2010 "," False ", 1268611200,1269561600], [ 218, «Южная Америка 2010 б», «Ложь», 1268956800,1269388800], [227, «Левант 2010 б», «Ложь», 1265846400,1266192000]]

И это полностью отличается от того, что я видел здесь: jQuery FullCalendar JSON, дата выпуска

(обратите внимание на отсутствие информации о тегах и фигурных скобках)

Может кто-нибудь объяснить мне, что я делаю неправильно и почему мой вывод неправильно отформатирован.

1020 * ТИА *

Ответы [ 4 ]

0 голосов
/ 25 марта 2010

Извините за медлительность, но я пропустил ваш комментарий, когда проверил кратко ранее.
Это оригинальный код моего ответа:

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");
    }
}

И использование (при размещении на Page_Load обычного веб-сайта ASP.NET):

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();

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

Очевидно, вам не нужно использовать метод расширения, который я написал (так как это просто то, что я написал, потому что я использую множество других сериализаторов Json, для которых это было полезно).

Итак, поехали. Это весь мой код, который работает для меня как обаяние. Удачи! :)

0 голосов
/ 19 марта 2010

Небольшая проблема с кодом (возможно преобразование) ....

Это:

    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 

Недопустимо в VB.Net, показывая ошибку "= New ()"

Каким будет правильный код? Я пробовал просто иметь "= New Meeting", но получаю ошибку "Значение типа 'MVC.Meeting' не может быть преобразовано в 'одномерный массив System.Type'."

0 голосов
/ 22 марта 2010

ФАО CodeSleuth (и всем остальным, кому это нужно).

Благодаря вам, и вы помогаете мне «понять» проблему, теперь у меня это работает.

Мой собственный код выглядит следующим образом:

    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

и следующее определение класса:

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

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

и следующая функция, опять же благодаря вам:

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

Конечный модуль

Это прекрасно работает, хотя мне нужно немного подправить его, чтобы прочитать результаты Linq (или просто изменить команду SQL на фильтр).

Опять же, большое спасибо за помощь в понимании проблемы, я твердо убежден в том, что нужно понимать, и теперь просто скопируйте код, и ваша помощь сделала это.

Jason

0 голосов
/ 18 марта 2010

Вы не можете просто использовать JsonSerializer на своих объектах - как видите, это не тот формат, который требуется для FullCalendar.

Вам нужно будет предоставить свой собственный сериализатор (преобразованный из 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

Вы можете использовать его следующим образом после заполнения списка Meeting из запроса:

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

(в пересчете с использованием: http://www.developerfusion.com/tools/convert/csharp-to-vb/)

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