使用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=false
是people[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
对象。 所有方式(除了我通过手动编码工作的方式)导致三种结果之一:
- 没有调用控制器操作(它的定义方式和我调用它之间的不匹配)
- 调用控制器操作,但param为null
- 调用控制器动作,并在数组中正确数量的对象元素但是没有传输这些对象的实际值(因此我有一个对象数组都具有默认值)。
有什么建议?
只需将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"); }