Deserializando o JSON Data no servidor (ASP.NET)
Pergunta
Atualmente, estou tentando implementar o maravilhoso jQuery plugin 'Week Calendar' (aqui) no meu site simples do ASP.NET. Eu configurei alguns [webMethods] para enviar dados para o calendário e responder aos eventos do lado do cliente (criando eventos, modificando eventos etc.).
A serialização automática de objetos do ASP.NET ao usar webMethods parece funcionar bem ao enviar os dados de volta, mas quando o inverso está acontecendo, estou enfrentando problemas.
O código JavaScript em questão que envia o evento do calendário de volta ao servidor é o seguinte:
save: function() {
calEvent.id = id;
id++;
calEvent.start = new Date(startField.val());
calEvent.end = new Date(endField.val());
calEvent.title = titleField.val();
calEvent.body = bodyField.val();
$calendar.weekCalendar("removeUnsavedEvents");
$calendar.weekCalendar("updateEvent", calEvent);
$dialogContent.dialog("close");
//SAVE TO DATABASE
$.ajax({
type: "POST",
url: "Tracker.aspx/AddEvent",
data: calEvent,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data) {
alert("saved");
}
});
Atualmente, eu só tenho um 'método de stub' no servidor para verificar se a desperalização funciona:
[WebMthod]
public static string AddEvent(Event e)
{
//save event to database and return something
return "done";
}
No entanto, estou pegando a seguinte exceção ao adicionar um evento:
JSON inválido Primitivo: Start.
No servidor, meu objeto de evento é constituído da seguinte forma:
[DataContract]
public class Event
{
[DataMember]
public int id { get; set; }
[DataMember]
public string title { get; set; }
[DataMember]
public string body { get; set; }
[DataMember]
public string start { get; set; }
[DataMember]
public string end { get; set; }
}
Solução
Modificando a chamada para o serviço da web da seguinte maneira fez o truque:
$.ajax({
type: "POST",
url: "Tracker.aspx/AddEvent",
data: '{e : ' + JSON.stringify(calEvent) + '}',
contentType: "application/json; charset=utf-8",
dataType: "text",
success: function(data) {
alert("saved");
}
});
Só tive que mexer com o formato do JSON sendo enviado ao servidor usando a função JSON.Stringify