7

jQuery1.9.1とMVC4を使用しています。

私は次のJavaScriptを持っています:

$.ajax({
    url: '/Home/doSomething',
    type: 'POST',
    data: JSON.stringify({ devices: [{ Id: 123, Name: "something", MapName: "map" },{ Id: 321, Name: "a name", MapName: "another map" }] }),
    dataType: 'json',
    contentType: 'application/json'
}

そして私のHomeControllerの次のc#:

[HttpPost]
public string doSomething( Device[ ] devices )
{
    //stuff consuming that array
}

Deviceクラスは次のように定義されます。

[Serializable]
public class Device
{
    public long Id;
    public string Name;
    public string MapName;
}

デバッガーによると、devices配列は2要素の配列であり、各Device要素のすべてのプロパティはnullです。

Chromeによると、投稿データは次のようになります。

{
    "devices": [
        {
            "Id": 123,
            "Name": "something",
            "MapName": "map"
        },
        {
            "Id": 321,
            "Name": "a name",
            "MapName": "another map"
        }
    ]
}

ここで、MVCがこれらのオブジェクトがヌルであると上下に誓うが、それでも適切な長さのオブジェクトの配列を提供しているのは何が問題なのですか?

JSON.stringifyを呼び出さずに、配列を直接投稿しようとしました。オブジェクト内の配列を「デバイス」と呼ばれるプロパティとして投稿しようとしましたが、これもまた非難することはありません。配列自体を文字列化するだけで、オブジェクト内の配列を「デバイス」と呼ばれるプロパティとして投稿しようとしました。

これらはすべて、何らかの形で悪い動作を引き起こします。chromeが最初に適切なデータを投稿しないか、MVCがそれを逆シリアル化しません。

私はウェブを精査しましたが、なぜこれが壊れるべきかについての例を見つけることができないようです。

2013-02-21 13:12 UTC-5を編集:

また、JSONを使用せずに、jQueryにフォームデータとして投稿させるだけでこれを試しました。そのためのコードは次のとおりです。

var postData = { devices: [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }] };
$.ajax({
    url: '/Home/doSomething',
    type: 'POST',
    data: postData
});

そして、C#はまだ上記と同じです。

ただし、動作はJSONの場合と同じです。MVCは2つの要素の配列を認識しますが、その配列内のオブジェクトのすべての値はデフォルトです(整数の場合は0、文字列の場合はnull)。

4

3 に答える 3

4

これが最終的に機能したものです...

まず、javascript を変更して、文字列化された配列を含む「devices」というプロパティを持つオブジェクトを作成しました。

var postData = { devices: JSON.stringify([{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }]) };
$.ajax({
    url: '/Home/doSomething',
    type: 'POST',
    dataType: 'json',
    data: postData
    }

次に、コントローラー アクションが「devices」という単一の文字列を取得するようにし、JSON.Net を使用して手動でシリアル化解除しました。

[HttpPost]
public string MakeMmLinks( string devices )
{
    List<Device> devicesList = JsonConvert.DeserializeObject<List<Device>>( devices );
    ...
}

これはうまくいきましたが、私が気になっているのは、オブジェクトの逆シリアル化が MVC がネイティブに処理するものであると想定されていることです。

ここで何が起こったのか、または私が何を間違えたのかについて誰かが洞察を持っている場合は、ぜひ聞きたいです。

于 2013-02-25T16:20:03.930 に答える
1

このような場合、私が見つけたtradition: trueのは非常に重要です。文字列化が必要かどうかわからない

dataType: 'json',
traditional: true
于 2013-02-20T22:46:48.477 に答える
0

2 つのデバイスの配列を含むプロパティを持つオブジェクトを投稿しています。デバイス配列を投稿するだけの場合は、次を試してください。

var devices = [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }];
$.ajax({
    url: '/Home/doSomething',
    type: 'POST',
    data: JSON.stringify(devices),
    dataType: 'json',
    contentType: 'application/json'
});
于 2013-02-20T21:50:54.247 に答える