FullCalendar未显示事件

时间:2011-05-04 20:10:38

标签: asp.net fullcalendar

我在ASP.NET 4上使用arshaw的FullCalendar jQuery插件。一切正常,事件被提取,但它们不会显示在日历中。我确定它们已被取出,FireBug会显示这样的响应:

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

我还尝试过手动序列化事件数组,但它不起作用。

fullcalendar.js中的$ .ajax():

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

这是我的VB代码,用于从数据库中获取事件并将它们返回到插件:

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

结束班

任何人都有解决方案吗?

非常感谢。

4 个答案:

答案 0 :(得分:1)

这是捕捉

而不是

events = events || [];

使用

events = events.d || [];

使用d参数,它将起作用。 如果您想知道这是什么感觉,您应该使用Encosia博客更新您的RSS阅读器。这个d是在ASP.NET 3.5中引入的(它不存在于MVC中,因为它是不同的框架)。

Quote from his blog

  

所有ASMX都是这种情况   服务JSON通过序列化   ASP.NET中的ASP.NET AJAX扩展   3.5。即使您只返回标量返回值,例如字符串,   int或boolean,结果会   始终被包含在“d”中。为什么   它改变了吗?虽然我希望如此   意外的变化更多   明确宣布,这是一个很好的。   以下是Dave Reed对此的解释   我:

     

{“d”:1}

     

不是有效的JavaScript声明,   在哪里:

     

[1]是。

     

所以包装“d”参数   阻止直接执行   字符串作为脚本。没有对象或数组   建设者担心。

     

[]是JavaScript的数组文字   符号,允许您实例化   没有显式调用的数组   构造函数。扩展戴夫的   解释,只需考虑一下   代码:[“Dave”,警报(“Do Evil”),   “Ward”]那个文字数组声明   将在大多数情况下执行警报   浏览器。危险!

您甚至可以使用一些解决方法使其与ASP.NET 2.0和ASP.NET 3.5 +

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

从jquery版本1.5.1开始,您可以使用

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

所以你甚至不必触及fullcallendar.js代码

答案 1 :(得分:0)

我不确定“d”是什么以及_type是什么,但是这应该从服务器看起来

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

我认为可能是因为你首先用“d”包装了这些东西然后“_type”完整日历可能无法提取它。

答案 2 :(得分:0)

查看以下内容

How to use Jquery fullcalender in asp.net

修改

fullcalender插件中存在一些问题。请按照this链接中提供的步骤进行操作,并相应地修改插件代码

答案 3 :(得分:0)

@nemke:您的回答帮助我让我的代码工作。谢谢!我确实必须从这样的Web服务反序列化我的结果,但是:

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