2014-02-14 56 views
1

我有以下JavaScript代码,建立一个对象数组,我试图通过ajax文章推送到一个asp.net-mvc行动。我想弄清楚下面这个错在哪里?如何通过Ajax将对象数组从javascript传递给asp.net-mvc函数?

的javascript:

var arr = []; 
for (var i = 0; i < 5; i++) { 
    var obj = { 
     statusId: i, 
     resizeable: true, 
     rows: [1, 2, 3, 4, 5] 
     }; 
     arr.push(obj); 
} 

$.ajax({ 
    type: 'POST', 
    traditional: true, 
    url: '/MyController/UpdateMe', 
    data { info: arr }, 
    success: function() { 
     alert("complete"); 
    } 
}); 

C#asp.net-MVC动作:

public ActionResult UpdateMe(IEnumerable<UpdateInfo> info) 
{ 
    foreach (var item in info) 
    { 
      Console.Write(item.statusIs + " has + " item.rows.length() + " items "); 
    } 
} 

public class UpdateInfo 
{ 
    public int statusId {get;set;} 
    public bool resizable {get;set;} 
    public List<int> rows {get;set;} 
} 
+0

你错过引用“/ MyControoller/UpdateMe”?另外,“控制器”似乎拼错了。 – linstantnoodles

+0

@linstantnoodles - 对不起,这只是一个错误的问题。更新 – leora

回答

3

默认jQuery.ajax contentType是application/x-www-form-urlencoded。这意味着参数以url字符串形式发送。在你的情况下,你的数组转换为字符串:object&object&object....

要改变这种behavoir,你应该在jQuery.ajax改变的contentType到application/json和你的JS对象转换成JSON与JSON.stringify

$.ajax({ 
    type: 'POST', 
    traditional: true, 
    contentType: 'application/json', 
    url: '/SchoolDetails/UpdateMe', 
    data: JSON.stringify({ info: arr }), 
    success: function() { 
     alert("complete"); 
    } 
}); 

行动在调试:

enter image description here

+0

注意:“UpdateMe”动作也必须用'[HttpPost]'标记。 – McGarnagle

+0

它不一定。动作上的属性仅影响过滤请求方法,即如果添加'HttpPost'属性,则动作将只接受发布请求,如果动作没有http属性,则它将接受所有请求方法。 – alexmac

+0

@亚历山大 - 这几乎适用于我。我现在看到信息数组正在填充在服务器上,但是当我查看数组时,每个项目都填充了statusId,但其中的rows数组已经为空(请参阅更新后的问题) – leora

0

不能传递一个JS阵列在POST请求中的参数。你必须把它变成一个字符串来传递给.NET动作。考虑使用jQuery.param()来做到这一点。它会将对象转换为像statusId=valueOfI&resizeable=true这样的字符串。然后你在动作中接收它之后将它从一个字符串改回到一个数组(因为我不知道.NET,所以我不能建议一个函数)。

相关问题