2012-03-07 20 views
7

Los datos enviados desde el cliente no se deserializarán.No se puede deserializar la matriz

Cliente:

$.ajax({ 
    type: 'POST', 
    dataType: "json", 
    url: 'savecommentsservice', 
    data: { "Pid": 0, "Comments": [{ "User": "bbbbbb", "Text": "aaaaaaaa" }, { "User": "ddddddd", "Text": "ccccccccc"}] }, 

DTO:

public class Comment 
{ 
    public string User { get; set; } 
    public string Text { get; set; } 
} 
public class SaveCommentsRequest 
{ 
    public int Pid { get; set; } 
    public string SiteId { get; set; } 
    public string Column { get; set; } 
    public List<Comment> Comments { get; set; } 
} 

Servidor:

Routes.Add<SaveCommentsRequest>("/savecommentsservice"); 

... 

public object Execute(SaveCommentsRequest request) 
    { 
     // Why is request.Comments null !!! All other params of the request works fine 

     // THe string I'm putting in is generated below - just to make sure its correct 
     request.Comments = new List<Comment>(); 
     request.Comments.Add(new Comment { Text = "aaaaaaaa", User = "bbbbbb" }); 
     request.Comments.Add(new Comment { Text = "ccccccccc", User = "ddddddd" }); 

     var thisIsWhatIPutInto$AjaxCall = JsonSerializer.SerializeToString<SaveCommentsRequest>(request); 

alguna idea de lo que está mal? ¿Por qué el conjunto Comentarios no está lleno? Como puede ver en los comentarios, he generado la cadena con el serializador json servicestack.

Tal vez me faltan algunos obvisos aquí?

EDITAR Al mirar cuál es el violinista beeing transmití veo esto:

POST http://localhost:4920/savecommentsservice HTTP/1.1 
Host: localhost:4920 
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 
Accept: application/json, text/javascript, */*; q=0.01 
Accept-Language: zh,en-us;q=0.7,en;q=0.3 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
X-Requested-With: XMLHttpRequest 
Referer: http://localhost:4920/default.cshtml?viewId=3 
Content-Length: 227 
Cookie: ASP.NET_SessionId=slbw453revfgmwuuxyrim1an 
Pragma: no-cache 
Cache-Control: no-cache 

SiteId=Site1&Pid=0&Column=C6&Comments%5B0%5D%5BUser%5D=bbbbbb&Comments%5B0%5D%5BText%5D=aaaaaaaa&Comments%5B1%5D%5BUser%5D=ddddddd&Comments%5B1%5D%5BText%5D=ccccccccc&Comments%5B2%5D%5BUser%5D=ggggggg&Comments%5B2%5D%5BText%5D= 

Y en Firebug:

Parametersapplication/x-www-form-urlencoded 
Column C6 
Comments[0][Text] aaaaaaaa 
Comments[0][User] bbbbbb 
Comments[1][Text] ccccccccc 
Comments[1][User] ddddddd 
Comments[2][Text] 
Comments[2][User] ggggggg 
Pid 0 
SiteId SiteId0 
Source 
SiteId=SiteId0&Pid=0&Column=C6&Comments%5B0%5D%5BUser%5D=bbbbbb&Comments%5B0%5D%5BText%5D=aaaaaaaa&Comments%5B1%5D%5BUser%5D=ddddddd&Comments%5B1%5D%5BText%5D=ccccccccc&Comments%5B2%5D%5BUser%5D=ggggggg&Comments%5B2%5D%5BText%5D= 

Saludos

Larsi

Respuesta

3

Como se puede ver de forma predeterminada Ajax de jQuery lo presenta como 'application/x-www-form-urlencoded', que es la forma HTML del anuncio Tipo de contenido predeterminado. Desafortunadamente no maneja muy bien los objetos anidados y ServiceStack esperará objetos anidados en el JSV Format.

Así que para los tipos/objetos anidados complejos que quiere decir jQuery para enviar la solicitud como JSON que se puede hacer especificando el contentType: application/json parámetro por ejemplo:

var data = { "Pid": 0, "Comments": [{ "User": "bbbbbb", "Text": "aaaaaaaa" }]}; 
$.ajax({ 
    type: 'POST', 
    dataType: "json", 
    contentType: "application/json", 
    url: 'savecommentsservice', 
    data: JSON.stringify(data) 
); 
+0

¡Hola! Antes que nada, gracias por un gran marco. Lo siento por la respuesta tardía. Configurar contentType en application/json me da la excepción: "Las definiciones de tipos deberían comenzar con '{', esperando el tipo serializado 'SaveCommentsRequest', obteniendo cadenas comenzando con: Pid = 0 & Comments% 5B0 ..." Cualquier cosa que deba cambiar en el servicio ? – Larsi

+0

Hola, me acabo de dar cuenta ** de que los datos ** deben ser serializados como JSON usando 'JSON.stringify()' ya que jQuery no lo hace automáticamente y lo envía en ** application/x-www-form-urlencoded ** ContentType de forma predeterminada, incluso si especifica el tipo de contenido JSON. De todos modos, la respuesta modificada para el trabajo. – mythz

1

creo necesita agregar el nombre del parámetro (solicitud) a su cadena. Algo a lo largo de las líneas de ..

$.ajax({ 
    type: 'POST', 
    dataType: "json", 
    url: 'savecommentsservice', 
    data: {"request": "Pid": 0, "Comments": [{ "User": "bbbbbb", "Text": "aaaaaaaa" }, { "User": "ddddddd", "Text": "ccccccccc"}] }, 
+0

Hola! Gracias por mirar en esto. Pero no, al agregar un nombre de parámetro nada se deserializa. Todos los niveles superiores se deserilizan correctamente, solo la matriz que está vacía – Larsi

Cuestiones relacionadas