1

MVC から FullCalendar を設定するのに苦労しています。この問題について少し支援をお願いします。

コントローラー用に次のコードがあります。

    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,"イタリア 2009 年","誤り",1241049600,1256083200],[189,"レバント 2010a","誤り",1265414400,1267574400],[195,"レバント 2010a","誤り", 1262736000,1262736000],[208,"レバント 2010a","False",1264982400,1267574400],[209,"レバント 2010a","False",1264982400,1265587200],[210,"レバント 2010","False0" ,1264982400,1266969600],[211,"レバント 2010 b","False",1267056000,1267574400],[213,"南アメリカ 2010a","False",1268438400,1269648000],[214,"10 レバント c" 2 ,"偽",1266364800,1264118400],[215,"南アメリカ 2010a","偽",1268611200,1269648000],[217,"南アメリカ 2010","偽",1268611200,1269561600],[218,"南アメリカ 2010 b"," False",1268956800,1269388800],[227,"levant 2010 b","False",1265846400,1266192000]]

これは、ここからの投稿で見たものとはまったく異なります: jQuery FullCalendar JSON date issue

(タグ情報と中括弧がないことに注意してください)

私が間違っている可能性があることと、出力が正しくフォーマットされていない理由を誰かに説明してもらえますか。

ティア

4

4 に答える 4

0

オブジェクトで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/ )

于 2010-03-18T10:20:44.757 に答える
0

コードのわずかな問題 (おそらく変換)...

これ:

    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 の 1 次元配列' に変換できません」というエラーが表示されます。

于 2010-03-19T09:26:38.880 に答える
0

FAO 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 コマンドをフィルターに変更するだけです)。

繰り返しますが、問題を理解するのを手伝ってくれてありがとう。私は理解する必要があり、今はコードをコピーするだけで、あなたの助けがそれを成し遂げたと固く信じています。

ジェイソン

于 2010-03-22T11:54:48.327 に答える
0

遅くなって申し訳ありませんが、以前簡単に確認したときにコメントを見逃していました。
これは私の答えの元のコードです:

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 Web サイトに配置した場合):

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 シリアライザーを使用するため、私が書いたものにすぎません)。

では、どうぞ。それは私の魅力のように動作するすべての私のコードです。幸運を!:)

于 2010-03-25T11:21:05.473 に答える