2

オブジェクトの配列を MVC3 コントローラー/アクションに渡そうとすると、問題が発生しました。私はウェブ上でいくつかの議論を見つけました (ここ SO を含む) が、どれも私の問題を解決していません。これが私が取り組んでいるものです:

public class Person
{
   public Guid TempId { get; set; }
   public bool ReadOnly { get; set; }
   [Required(ErrorMessage = "Required")]
   public string Name { get; set; }
}

これが私のコントローラーアクションです(現在、私は多くのバリエーションを試しました)。

[HttpGet]
public ActionResult AddPerson(List<Person> people)
{
    if (null != people)
    {
        foreach (var person in people)
        {
           Debug.WriteLine(person );
        }
     }
    return View();
}

行動を促すために jquery を構造化するさまざまな方法を試しましたが、これまでのところ、次のようにオブジェクトの配列を URL 文字列に手動でエンコードする方法しかありません。

var url = "AddPerson?people%5B0%5D.TempId=9FBC6EF8-67DB-4AB4-8FCE-5DFC0F2A69F9&people%5B0%5D.ReadOnly=true&people%5B0%5D.Name=Bob+Jones&people%5B1%5D.TempId=9FBC6EF8-67DB-4AB4-8FCE-5DFC0F2A6333&people%5B1%5D.ReadOnly=false&people%5B1%5D.Name=Mary+Jones #peopleDiv";
$("#peopleDiv").load(url, updatePeopleDiv);

people%5B1%5D.ReadOnly=falseエンコードされたバージョンです。people[1].ReadOnly=false

私は次のような他のことを試しました:

var url = "AddPerson #peopleDiv";
var people = [];
people.push({'[0].TempId': '<valid guid>', '[0].ReadOnly': true, '[0].Name': 'Bob Jones' });
$("#peopleDiv").load(url, people, updatePeopleDiv); // nope
$("#peopleDiv").load(url, $.param(people, false), updatePeopleDiv); // nada
$("#peopleDiv").load(url, $.param(people, true), updatePeopleDiv); // nyet

また、その people[] をオブジェクト内にラップして、上記を変更してみました:var data = { arr: people }そして、そのdataオブジェクトをさまざまな方法で送信しようとしました。すべての方法 (手動でエンコードして動作するようになった方法を除く) は、次の 3 つの結果のいずれかになります。

  1. コントローラーアクションが呼び出されていません (定義方法と呼び出し方法が一致しません)
  2. コントローラー アクションが呼び出されましたが、パラメーターが null です
  3. コントローラーアクションが呼び出され、配列内の正しい数のオブジェクト要素が転送されますが、これらのオブジェクトからの実際の値は転送されません (したがって、すべてデフォルト値を持つオブジェクトの配列があります)。

助言がありますか?

4

1 に答える 1

4

contentType を に設定し'application/json'て使用するだけJSON.stringify()です。

$.ajax({
            contentType: 'application/json',
            type: 'POST',
            url: '/Controller/AddPerson',
            data: JSON.stringify({
                people: [
                    {
                      ReadOnly: false,
                      Name: 'Cristi'
                    },
                    {
                      ReadOnly: true,
                      Name: 'Matt'
                    }
                ]
            }),
            success: function (data) {
                $("#peopleDiv").html(data);
            },
            error: function () {
                console.trace();
            }
        });

また、追加/編集/削除リクエストは POST 経由で行う必要があります。

[HttpPost]
public ActionResult AddPerson(List<Person> people)
{
    if (null != people)
    {
        foreach (var person in people)
        {
           Debug.WriteLine(person );
        }
     }
    return PartialView("viewname");
}
于 2013-03-29T10:24:25.603 に答える