我在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
结束班
任何人都有解决方案吗?
非常感谢。
答案 0 :(得分:1)
这是捕捉
而不是
events = events || [];
使用
events = events.d || [];
使用d参数,它将起作用。 如果您想知道这是什么感觉,您应该使用Encosia博客更新您的RSS阅读器。这个d是在ASP.NET 3.5中引入的(它不存在于MVC中,因为它是不同的框架)。
所有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 + ')');
}
}
});