私は ASP.NET MVC と JQuery を学習するために小さなアプリを作成しています。ページの 1 つは、選択できる項目のリストです。次に、ボタンを押して、JQuery の Post 関数を使用して、選択された項目の ID を含むリスト (または同等のもの) をコントローラーに送信したいと思います。
選択された要素の ID を含む配列を取得できたので、それを投稿したいと思います。これを行う 1 つの方法は、ページに非表示の値を持つダミー フォームを用意し、選択された項目で非表示の値を設定して、そのフォームを投稿することです。ただし、これは見た目が不格好です。
配列をコントローラーに直接送信することで、これを実現するよりクリーンな方法はありますか? いくつか試してみましたが、コントローラーは受信したデータをマップできないようです。これまでのコードは次のとおりです。
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
そして私のコントローラーはこのようになります
public ActionResult GenerateList(List<string> values)
{
//do something
}
私が取得できたのは、コントローラー パラメーターの「null」だけです...
任意のヒント?
ベストアンサー1
私は自分の回答を修正し、作成したテスト アプリのコードを含めました。
更新: jQuery を更新して 'traditional' 設定を true に設定し、これが再び機能するようになりました (@DustinDavis の回答による)。
まずJavaScript:
function test()
{
var stringArray = new Array();
stringArray[0] = "item1";
stringArray[1] = "item2";
stringArray[2] = "item3";
var postData = { values: stringArray };
$.ajax({
type: "POST",
url: "/Home/SaveList",
data: postData,
success: function(data){
alert(data.Result);
},
dataType: "json",
traditional: true
});
}
コントローラー クラスのコードは次のとおりです。
public JsonResult SaveList(List<String> values)
{
return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}
その JavaScript 関数を呼び出すと、「リストの最初の項目: 'item1'」というアラートが表示されます。