2012-04-04 7 views
16

私はこの問題を解決するために苦労しています。JSONからMVCコントローラとしてポスト配列

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

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 */ }); 

OR

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

第二の方法は、ポストされたデータを見ると、この

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 
} 

My 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が完全に間違っていますか?このデータを厳密に型指定されたオブジェクトに変換するにはどうすればよいですか?

多くのおかげ

+0

MVCのMark-classはどのように見えますか? – Pbirkoff

+0

@Pbirkoff私はクラス –

+1

で質問を更新しました。この質問、特に最初の回答を確認してください:http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp -net-mvc3 – Pbirkoff

答えて

14

$.post()あなたはAJAX呼び出しのコンテンツタイプを設定することはできません - あなたは(あなたがバイオリンを使用している場合)あなたのJSON文字列は、「アプリケーションのコンテンツタイプで送信されていることを見つけるかもしれないが/ x-www-form-urlencoded "(既定の設定)、Asp.Net MVCがデータパケットを誤って解釈する原因になります。

代わりに$.ajax()を使用して、コンテンツタイプを "application/json"に設定できますか?

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

+0

ああ、あなたはそれに私を打つ、同じ考えを持っていた – Pbirkoff

+1

ありがとう!私はそれが何か簡単だろうと知っていたすべての頭痛の後! '$ .ajax()'を使ってコードを変更し、データをJSON.stringify($ marks)として渡しました –

+0

ありがとうございました。それは私の場合のコンテンツタイプでした。 – Jelling

13

@SteveHobbsここに正しい答えを持っています。一方、JSON.stringifyはJavaScriptペイロードと同じようにする必要があります。それ以外の場合は、入ってくるデータのデシリアライズ中に「無効なJSONプリミティブ」のような例外が発生します。ここで

はあなたのサンプルに完全なソリューションです:

$.ajax({ 

    url: '/home/index', 
    type: 'POST', 
    data: JSON.stringify($marks), 
    dataType: 'json', 
    contentType: 'application/json', 
    success: function (data, textStatus, jqXHR) { 
     console.log(data); 
    } 
}); 
1

このコードは私の問題を修正:

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



     } 
    }); 

あなたのシナリオに必要な変更を加えてお楽しみください! :)

+0

このコードはjsonオブジェクトのオブジェクト配列ではない – mzonerz

関連する問題