Невозможно десериализовать массив - PullRequest
7 голосов
/ 07 марта 2012

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

Клиент:

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

Есть идеи, что случилось? Почему массив комментариев не заполнен. Как видно из комментариев, я сгенерировал строку с помощью сериализатора json servicestack.

Может быть, мне здесь не хватает какого-то наблюдательного?

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=

А в 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=

Привет

Larsi

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Как вы можете видеть по умолчанию, Ajax в jQuery представляет его как 'application / x-www-form-urlencoded', который является HTML-типом публикации по умолчанию для Content-Type.К сожалению, он плохо обрабатывает вложенные объекты, и ServiceStack ожидает вложенные объекты в формате JSV .

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

var data = { "Pid": 0, "Comments": [{ "User": "bbbbbb", "Text": "aaaaaaaa" }]};
$.ajax({
     type: 'POST',
     dataType: "json",
     contentType: "application/json",
     url: 'savecommentsservice',
     data: JSON.stringify(data)
);
1 голос
/ 07 марта 2012

Полагаю, вам нужно добавить имя параметра (запроса) в вашу строку. Нечто подобное ...

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