JSONを使用してMVC3にオブジェクトの配列をポストするソリューションを探しています。私はのオフに働いてJSONを介してASP.Netにオブジェクトの配列を投稿するMVC3
例コード: http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx
JS:
var data = { ItemList: [ {Str: 'hi', Enabled: true} ], X: 1, Y: 2 };
$.ajax({
url: '/list/save',
data: JSON.stringify(data),
success: success,
error: error,
type: 'POST',
contentType: 'application/json, charset=utf-8',
dataType: 'json'
});
ListViewModel.cs:
public class ListViewModel
{
public List<ItemViewModel> ItemList { get; set; }
public float X { get; set; }
public float Y { get; set; }
}
ItemViewModel.cs:
public class ItemViewModel
{
public string Str; // originally posted with: { get; set; }
public bool Enabled; // originally posted with: { get; set; }
}
ListController.cs:
public ActionResult Save(ListViewModel list)
{
// Do something
}
このPOSTの結果:
リストが設定され、下地ITEMLISTプロパティが設定されている
そのXおよびYプロパティが
に設定されているListViewModelに
ITEMLIST 1つのアイテムが含まれています。
そのItemListのアイテムは初期化されていません。 Strはnull、Enabledはfalseです。
別の言い方をすれば、これは私が結合MVC3のモデルから得るものです:
list.X == 1
list.Y == 2
list.ItemList != null
list.ItemList.Count == 1
list.ItemList[0] != null
list.ItemList[0].Str == null
をMVC3 JsonValueProviderは、複雑なオブジェクトのために働いていないと思われます。これをどのように機能させるには?既存のMVC3 JsonValueProviderを修正して修正する必要がありますか?もしそうなら、どうやってMVC3プロジェクトに取り替えるのですか?私はすでに無駄に追求してきました
関連StackOverflowの質問:
Asp.net Mvc Ajax Json (post Array) はMVC2と古いフォームベースのエンコードを使用する - そのアプローチは、オブジェクトの配列を含むオブジェクトで失敗(jQueryのそれを適切にエンコードするために失敗しました)。
Post an array of complex objects with JSON, JQuery to ASP.NET MVC Controller ハックを使用する代わりにコントローラがフレームワークを利用するのではなく、手動でデシリアライズするプレーンストリングを受け取ることを避けたいと思います。
MVC3 RC2 JSON Post Binding not working correctly コンテンツタイプが設定されていません。コードに設定されています。
How to post an array of complex objects with JSON, jQuery to ASP.NET MVC Controller? この貧しい人は、配列を解析するためにJsonFilterを書く必要がありました。私が避けたいもう一つのハック。
これをどうすればいいですか?
更新:私はJsonValueProviderFactoryを掘り下げました。正しく "str"プロパティを消費し、正しく見えるKey = "ItemList [0] .Str"、Value = "hi"としてバッキングディクショナリに追加します。 ModelBinder? –
あなたはスタックオーバーフロー問題の優れた実行のためにupvoteとスターを受け取ったばかりです! :) – Moulde
これは、これが最終的に私のために働くようになったものです。ありがとう! – Otake