2012-03-07 29 views
7

Dữ liệu được gửi từ máy khách sẽ không được deserialized.Không thể deserialize mảng

Chủ đầu tư:

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

Server:

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

Bất cứ ý tưởng gì sai? Tại sao mảng Nhận xét không được điền. Như bạn có thể thấy từ các ý kiến ​​tôi đã tạo ra chuỗi với serial serial servicestack.

Có thể tôi đang thiếu một số nội dung xấu hổ ở đây?

EDIT Khi nhìn vào cáy whats beeing truyền Tôi thấy điều này:

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= 

Và trong 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= 

Trân

Larsi

Trả lời

3

Như bạn có thể nhìn thấy bằng cách mặc định Ajax jQuery nộp nó như 'application/x-www-form-urlencoded' là mặc định HTML Form bài Content-Type. Thật không may nó không xử lý các đối tượng lồng nhau rất tốt và ServiceStack sẽ mong đợi các đối tượng lồng nhau trong JSV Format.

Vì vậy, đối với các loại phức tạp/đối tượng lồng nhau bạn muốn nói với jQuery để gửi yêu cầu như JSON mà bạn có thể làm bằng cách xác định contentType: application/json tham số ví dụ:

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

Xin chào! Trước hết, cảm ơn cho một khuôn khổ tuyệt vời. Xin lỗi vì trả lời muộn. Thiết lập contentType thành application/json cho tôi ngoại lệ: "Định nghĩa kiểu sẽ bắt đầu bằng '{', mong đợi kiểu tuần tự 'SaveCommentsRequest', nhận chuỗi bắt đầu bằng: Pid = 0 & Comments% 5B0 ..." Mọi thứ tôi nên thay đổi trong dịch vụ ? – Larsi

+0

Xin chào, chỉ cần nhận ra ** dữ liệu ** cần được tuần tự hóa dưới dạng JSON bằng cách sử dụng 'JSON.stringify()' vì jQuery không tự động làm điều đó cho bạn và gửi nó trong ** application/x-www-form-urlencoded ** ContentType theo mặc định, ngay cả khi bạn chỉ định contentType JSON. Dù sao sửa đổi câu trả lời để làm việc. – mythz

1

Tôi tin bạn cần phải thêm tên của tham số (yêu cầu) vào chuỗi của bạn. cái gì đó dọc theo dòng của ..

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

Hi! Cảm ơn đã xem xét này. Nhưng không, khi thêm một parametername không có gì được deserialized. Tất cả các cấp cao nhất đều được khử muối một cách chính xác, chỉ có mảng trống rỗng – Larsi

Các vấn đề liên quan