2012-03-07 15 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); 

任意のアイデア? Comments配列に値が設定されないのはなぜですか?コメントからわかるように、私はservicestack jsonシリアライザで文字列を生成しました。

多分私はいくつかここでobvisousを逃していますか?

EDIT 送信beeingていただきましたシオマネキを見たとき、私はこれを参照してください。

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

の線に沿って 何かがjQueryのアヤックスは、「アプリケーション/ x-www-form-urlencodedで」デフォルトHTMLフォームポストのContent-Typeであるとして、それを提出します。残念ながら、ネストされたオブジェクトは非常にうまく処理されず、ServiceStackはJSV Formatのネストされたオブジェクトを期待しています。だから、

複合型/ネストされたオブジェクトのためにあなたがのcontentType指定することによって行うことができますJSONとして要求を送信するためのjQueryをお伝えしたいと思います:例えばアプリケーション/ 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.stringify()を使用してJSONとしてシリアル化する必要があります.jQueryは自動的にそれを実行せず、** application/x-www-form-urlencoded ** JSON contentTypeを指定した場合でも、デフォルトでContentType。とにかく修正された仕事への答え。 – mythz

1

をあなたの文字列にパラメータの名前(要求)を追加する必要があります。あなたは、デフォルトでは見ることができるように...

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

こんにちは!これを見ていただきありがとうございます。しかし、いいえ、パラメータ名を追加すると、デシリアライズされません。すべての最上位レベルが正しく消され、空の配列のみ – Larsi

関連する問題