17

私はこの問題の解決策を見つけるのに苦労しています。

私のコードでは、オブジェクトの配列を構築しています。

var $marks = [];

var mark = function ( x, y, counter ){
    this.x = x;
    this.y = y;
    this.counter = counter;
}

$marks.push(new mark(1, 2, 0));   
$marks.push(new mark(1, 2, 1));
$marks.push(new mark(1, 2, 2));

ここで、このデータを MVC コントローラーにポストしたいので、コントローラーのデータ型は、List<Mark> Marksまたはマークの配列になると思います。

データを投稿するために、試しました。

var json = JSON.stringify($marks);
$.post('url', json).done(function(data){ /* handle */ });

また

var json = { Marks: $marks };
$.post('url', json).done(function(data){ /* handle */ });

2つ目の方法、投稿されたデータを見るとこんな感じ

Marks[0][x]: 1
Marks[0][y]: 2
Marks[0][counter]: 0
Marks[0][x]: 1
Marks[0][y]: 2
Marks[0][counter]: 1
Marks[0][x]: 1
Marks[0][y]: 2
Marks[0][counter]: 2

しかし、これをコントローラーで強く型付けされたオブジェクトに変換する方法がわかりませんか?

私のコントローラーは次のようになります。

[HttpPost]
public ActionResult JsonSaveMarks(List<Mark> Marks){
    // handle here
}

私の Mark クラスは次のようになります。

public class Mark{
     public string x { get; set; }
     public string y { get; set; }
     public string counter { get; set; }
}

カスタムJsonFilterAttributeの作成、またはSystem.Web.Script.Serialization.JavaScriptSerializerクラスの使用に関する他の同様の問題を読みましたが、何も機能しません

ここで私が見逃している明らかなものはありますか?コントローラーの DataType が完全に間違っていますか? 投稿されたこのデータを厳密に型指定されたオブジェクトに変換するにはどうすればよいですか?

どうもありがとう

4

3 に答える 3

15

$.post()では、AJAX 呼び出しのコンテンツ タイプを設定できません。(Fiddler を使用している場合) Json 文字列が "application/x-www-form-urlencoded" のコンテンツ タイプで送信されていることに気付くかもしれません (これにより、Asp.Net MVC がデータ パケットを正しく解釈しなくなります。

$.ajax()代わりに使用してみて、コンテンツ タイプを「application/json」に設定してもらえますか?

http://api.jquery.com/jQuery.ajax/

于 2012-04-04T09:01:30.327 に答える
14

@SteveHobbs はここで正しい答えを持っています。一方、JSON.stringifyJavaScript ペイロードは、あなたが行ったようにする必要があります。他の方法で行うと、入ってくるデータの逆シリアル化中に「無効な JSON プリミティブ」などの例外が発生します。

サンプルの完全なソリューションは次のとおりです。

$.ajax({

    url: '/home/index',
    type: 'POST',
    data: JSON.stringify($marks),
    dataType: 'json',
    contentType: 'application/json',
    success: function (data, textStatus, jqXHR) {
        console.log(data);
    }
});
于 2012-04-04T09:17:59.433 に答える
2

このコードは私の問題を解決しました:

C# クラス:

public class MediaAccountContent
{
    public Guid IdMedia { get; set; }
    public string Value { get; set; }

}

public class User
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public List<MediaAccountContent> MediaAccountContents { get; set; }
}

MVC アクション:

public ActionResult SavePlace(User user)
{

    return Content("OK");
}

Javascript:

    var mediaAccountsJson = [];

    for (var i = 0; i < 10; i++)
    {
        mediaAccountsJson.push({
            IdMedia: i,
            Value: "AAA" + i
        });

    }

    var datatItem =
    {
        Firstname: "Test Firstname",
        Lastname: "Test Lastname",
        MediaAccountContents: mediaAccountsJson
    };

    $.ajax({
        type: "POST",
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(datatItem),
        url: urlAction,
        success: function (status) {



        }
    });

シナリオに必要な変更を加えて楽しんでください! :)

于 2014-11-10T07:17:43.803 に答える