1. ホーム
  2. jquery

[解決済み] ASP.NET MVC Controllerにフォームを使わずに文字列の配列を投稿するにはどうすればよいですか?

2022-04-13 14:59:15

質問

ASP.NET MVCとJQueryを学ぶために小さなアプリを作っているのですが、ページの1つは項目のリストで、その中のいくつかを選択することができます。ボタンを押すと、JQueryのPost関数を使って、選択された項目のIDを含むリスト(または同等の何か)をコントローラに送信したいと思います。

選択された要素のIDを持つ配列を取得することができたので、今度はそれを投稿したいと思います。これを行う1つの方法は、hidden値を持つダミーフォームをページ内に作成し、選択されたアイテムをhidden値として設定し、そのフォームを投稿することです; しかし、これは残酷に見えます。

これを実現するために、配列を直接コントローラに送るという、よりすっきりした方法はないでしょうか?いくつか試してみましたが、コントローラは受信したデータをマップすることができないようです。以下は、これまでのコードです。

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"が入っているだけなのですが...。

何かヒントがあれば教えてください。

解決方法は?

私が行ったテストアプリのコードを含むように、私の応答を修正しました。

更新: 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関数を呼び出すと、"First item in list.というアラートが表示されます。'item1'" と表示されます。 これがお役に立てれば幸いです。