使用jquery.load将对象数组传递给MVC 3

我遇到了一个试图将一组对象传递给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 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=falsepeople[1].ReadOnly=false的编码版本people[1].ReadOnly=false

我尝试过其他的东西,比如:

 var url = "AddPerson #peopleDiv"; var people = []; people.push({'[0].TempId': '', '[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对象。 所有方式(除了我通过手动编码工作的方式)导致三种结果之一:

  1. 没有调用控制器操作(它的定义方式和我调用它之间的不匹配)
  2. 调用控制器操作,但param为null
  3. 调用控制器动作,并在数组中正确数量的对象元素但是没有传输这些对象的实际值(因此我有一个对象数组都具有默认值)。

有什么建议?

只需将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 people) { if (null != people) { foreach (var person in people) { Debug.WriteLine(person ); } } return PartialView("viewname"); }