将对象列表传递给使用jQuery Ajax的MVC控制器方法

我想通过使用jQuery的ajax()函数传递一个对象数组到一个MVC控制器方法。 当我进入PassThing()C#控制器方法时,参数“things”为空。 我已经尝试过这种使用Listtypes的参数,但这也不起作用。 我究竟做错了什么?

<script type="text/javascript"> $(document).ready(function () { var things = [ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]; $.ajax({ contentType: 'application/json; charset=utf-8', dataType: 'json', type: 'POST', url: '/Xhr/ThingController/PassThing', data: JSON.stringify(things) }); }); </script> public class ThingController : Controller { public void PassThing(Thing[] things) { // do stuff with things here... } public class Thing { public int id { get; set; } public string color { get; set; } } } 

使用NickW的build议,我能够得到这个工作使用things = JSON.stringify({ 'things': things }); 这是完整的代码。

 $(document).ready(function () { var things = [ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]; things = JSON.stringify({ 'things': things }); $.ajax({ contentType: 'application/json; charset=utf-8', dataType: 'json', type: 'POST', url: '/Home/PassThings', data: things, success: function () { $('#result').html('"PassThings()" successfully called.'); }, failure: function (response) { $('#result').html(response); } }); }); public void PassThings(List<Thing> things) { var t = things; } public class Thing { public int Id { get; set; } public string Color { get; set; } } 

我从中学到了两件事情:1)contentType和dataType设置在ajax()函数中是绝对必要的。 如果他们失踪,这将无法正常工作。 经过多次尝试和错误,我发现了这一点。 2)要将一个对象数组传递给MVC控制器方法,只需使用JSON.stringify({'things':things})格式。

我希望这可以帮助别人!

你不能这样做吗?

 var things = [ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]; $.post('@Url.Action("PassThings")', { things: things }, function () { $('#result').html('"PassThings()" successfully called.'); }); 

…并标记你的行动

 [HttpPost] public void PassThings(IEnumerable<Thing> things) { // do stuff with things here... } 

格式化您的数据可能是问题。 尝试以下任一方法:

 data: '{ "things":' + JSON.stringify(things) + '}', 

或者(从我怎么能没有一个表单的string数组发布到ASP.NET MVC控制器? )

 var postData = { things: things }; ... data = postData 

我对这一切有完美的回答:我尝试了很多解决scheme,终于没有办法让自己能够pipe理,请在下面find详细的答案:

  $.ajax({ traditional: true, url: "/Conroller/MethodTest", type: "POST", contentType: "application/json; charset=utf-8", data:JSON.stringify( [ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]), success: function (data) { $scope.DisplayError(data.requestStatus); } }); 

的Controler

 public class Thing { public int id { get; set; } public string color { get; set; } } public JsonResult MethodTest(IEnumerable<Thing> datav) { //now datav is having all your values } 

这是您查询的工作代码,您可以使用它。

的Controler

  [HttpPost] public ActionResult save(List<ListName> listObject) { //operation return Json(new { istObject }, JsonRequestBehavior.AllowGet); } } 

JavaScript的

  $("#btnSubmit").click(function () { var myColumnDefs = []; $('input[type=checkbox]').each(function () { if (this.checked) { myColumnDefs.push({ 'Status': true, 'ID': $(this).data('id') }) } else { myColumnDefs.push({ 'Status': false, 'ID': $(this).data('id') }) } }); var data1 = { 'listObject': myColumnDefs}; var data = JSON.stringify(data1) $.ajax({ type: 'post', url: '/Controller/action', data:data , contentType: 'application/json; charset=utf-8', success: function (response) { //do your actions }, error: function (response) { alert("error occured"); } }); 
  var List = @Html.Raw(Json.Encode(Model)); $.ajax({ type: 'post', url: '/Controller/action', data:JSON.stringify({ 'item': List}), contentType: 'application/json; charset=utf-8', success: function (response) { //do your actions }, error: function (response) { alert("error occured"); } }); 

唯一的办法,我可以得到这个工作是传递JSON作为一个string,然后使用JavaScriptSerializer.Deserialize<T>(string input)反序列化,这是很奇怪,如果这是MVC 4的默认解串器。

我的模型嵌套了对象列表,最好的我可以得到使用JSON数据是最上面的列表中有正确数量的项目,但项目中的所有字段为空。

这种事情不应该这么难。

  $.ajax({ type: 'POST', url: '/Agri/Map/SaveSelfValuation', data: { json: JSON.stringify(model) }, dataType: 'text', success: function (data) { [HttpPost] public JsonResult DoSomething(string json) { var model = new JavaScriptSerializer().Deserialize<Valuation>(json); 

如果您使用ASP.NET Web API,那么您应该只传递data: JSON.stringify(things)

你的控制器应该是这样的:

 public class PassThingsController : ApiController { public HttpResponseMessage Post(List<Thing> things) { // code } } 

从@veeresh修改i

  var data=[ { id: 1, color: 'yellow' }, { id: 2, color: 'blue' }, { id: 3, color: 'red' } ]; //parameter var para={}; para.datav=data; //datav from View $.ajax({ traditional: true, url: "/Conroller/MethodTest", type: "POST", contentType: "application/json; charset=utf-8", data:para, success: function (data) { $scope.DisplayError(data.requestStatus); } }); In MVC public class Thing { public int id { get; set; } public string color { get; set; } } public JsonResult MethodTest(IEnumerable<Thing> datav) { //now datav is having all your values } 

用包含与MVC控制器所期望的参数名称相匹配的属性的另一个对象包装对象列表。 重要的是围绕对象列表的包装。

 $(document).ready(function () { var employeeList = [ { id: 1, name: 'Bob' }, { id: 2, name: 'John' }, { id: 3, name: 'Tom' } ]; var Employees = { EmployeeList: employeeList } $.ajax({ dataType: 'json', type: 'POST', url: '/Employees/Process', data: Employees, success: function () { $('#InfoPanel').html('It worked!'); }, failure: function (response) { $('#InfoPanel').html(response); } }); }); public void Process(List<Employee> EmployeeList) { var emps = EmployeeList; } public class Employee { public int Id { get; set; } public string Name { get; set; } }