Imansible deserializzare la matrice

I dati inviati dal cliente non verranno deserializzati.

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 Comments { get; set; } } 

Server:

 Routes.Add("/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(); request.Comments.Add(new Comment { Text = "aaaaaaaa", User = "bbbbbb" }); request.Comments.Add(new Comment { Text = "ccccccccc", User = "ddddddd" }); var thisIsWhatIPutInto$AjaxCall = JsonSerializer.SerializeToString(request); 

Qualche idea cosa c’è che non va? Perché l’array Commenti non è popolato. Come puoi vedere dai commenti ho generato la stringa con il serializzatore json di servicestack.

Forse mi mancano alcune cose qui?

EDIT Guardando al violinista che cosa è trasmesso vedo questo:

  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= 

E in 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= 

Saluti

Larsi

Come puoi vedere, per impostazione predefinita, Ajax di jQuery lo invia come ‘application / x-www-form-urlencoded’, che è il tipo di contenuto del post HTML Form predefinito. Sfortunatamente non gestisce molto bene gli oggetti nidificati e ServiceStack si aspetta oggetti nidificati nel formato JSV .

Quindi per tipi complessi / oggetti nidificati si vuole dire a jQuery di inviare la richiesta come JSON che si può fare specificando il contentType: parametro application / json es:

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

Credo che sia necessario aggiungere il nome del parametro (richiesta) alla stringa. Qualcosa sulla falsariga di ..

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