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,"South America 2008","False",1203033600,1227657600],[48,"Levant 2009","False",1231804800,1233619200],[49,"South America 2009","False",1235433600 ,1237420800],[50,"意大利 2009","假",1241049600,1256083200],[189,"黎凡特 2010a","假",1265414400,1267574400],[195,"黎凡特 2010a","假", 1262736000,1262736000],[208,"黎凡特 2010a","假",1264982400,1267574400],[209,"黎凡特 2010a","假",1264982400,1265587200],[210,"黎凡特 2010","假" ,1264982400,1266969600],[211,"黎凡特 2010 b","假",1267056000,1267574400],[213,"南美 2010a","假",1268438400,1269648000],[214,"黎凡特 2010 c" "假",1266364800,1264118400],[215,"南美 2010a","假",1268611200,1269648000],[217,"南美 2010","假",1268611200,1269561600],[218,"南美 2010 b","假”,1268956800,1269388800],[227,”levant 2010 b”,“假”,1265846400,1266192000]]

这与我在这里看到的帖子完全不同:jQuery FullCalendar JSON date issue

(注意缺少标签信息和花括号)

有人可以向我解释我可能做错了什么以及为什么我的输出格式不正确。

TIA

4

4 回答 4

0

粮农组织 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

代码的小问题(也许是转换)....

这个:

    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'的一维数组”的错误。

于 2010-03-19T09:26:38.880 回答
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

对不起,我之前简短检查时错过了您的评论。
这是我的答案的原始代码:

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 序列化程序)。

所以你去。这就是我的所有代码,这对我来说就像一个魅力。祝你好运!:)

于 2010-03-25T11:21:05.473 回答