2012-03-07 4 views
7

Данные, отправленные с клиента, не будут десериализованы.Невозможно десериализовать массив

Клиент:

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

Сервер:

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); 

Любая идея, что случилось? Почему массив комментариев не заполняется. Как вы можете видеть из комментариев, я сгенерировал строку с сериализатором сериализации jQuery.

Возможно, мне не хватает какого-то живого здесь?

EDIT При взгляде на стельку, Что неоспоримым передаваемое я вижу это:

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= 

И поджигатель:

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= 

С уважением

Larsi

ответ

3

Как вы можете увидеть по умолчанию Ajax JQuery в представляет его как 'применение/х-WWW-форм-urlencoded', которая по умолчанию HTML Form Post Content-Type. К сожалению, он не очень хорошо обрабатывает вложенные объекты, и ServiceStack ожидает вложенные объекты в JSV Format.

Таким образом, для сложных типов/вложенных объектов, которые вы хотите сказать JQuery, чтобы отправить запрос в формате JSON, который вы можете сделать, указав CONTENTTYPE: приложения/JSON параметр например:

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

Привет! Прежде всего, спасибо за отличную основу. Простите за поздний ответ. Установка contentType в application/json дает мне исключение: «Определения типов должны начинаться с« {», ожидая сериализованного типа« SaveCommentsRequest », получили строку, начинающуюся с: Pid = 0 & Comments% 5B0 ...« Все, что я должен изменить в сервисе ? – Larsi

+0

Привет, только что реализованные ** данные ** должны быть сериализованы как JSON с использованием 'JSON.stringify()', поскольку jQuery не делает это автоматически для вас и отправляет его в ** application/x-www-form-urlencoded ** ContentType по умолчанию, даже если вы указываете тип содержимого JSON. В любом случае, измененный ответ на работу. – mythz

1

Я считаю, вам нужно добавить имя параметра (запроса) в строку. Что-то вдоль линий ..

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

Привет! Спасибо, что посмотрели на это. Но нет, при добавлении параметра имя ничего не десериализуется. Все верхние уровни получают deserilized правильно, только массив, который пуст – Larsi

Смежные вопросы