2011-10-28 26 views
14

当我送INT的列表使用jQuery这样的:如何用jQuery发送INT的列表ASP.net MVC默认模型绑定

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

然后jQuery将变换pkList对象,并通过发送发布这样的:

pkList[]:1 
pkList[]:2 
pkList[]:3 

如果服务器是PHP这将是很好,但我使用Asp.NET MVC3,并尝试用默认的模型绑定来获取这些值:

public ActionResult Execute(ICollection<int> pkList) 

但pkList始终为空,似乎默认的模型联编程序无法将其绑定。

如何正确解决此问题?


ADDEDSOLUTION

我使用达林季米特洛夫的解决方案与设定的jQuery的traditional选项:

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    traditional: true, 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

现在的jQuery不将[]添加到参数并且它们是这样发送的:

pkList:1 
pkList:2 
pkList:3 

而MVC默认模型联编程序正确地获取值。

希望这可以帮助别人。

回答

16

你可以使用一个JSON请求,因为它可以让你给你希望的任何复杂的对象:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ pkList: [1, 2, 3] }), // you could throw any javascript object you like here 
    success: function(result) { 
     // process the results 
    } 
}); 

JSON.stringify方法是建立在现代浏览器,如果你想支持传统浏览器,你可以包括json2.js脚本到您的网站。

并回答你的问题,你可以使用设置traditional: true选项指示jQuery的,因为这在jQuery的1.4已经改变退却到传统系列化的参数,如果你使用的是更高版本,你需要切换的可能性返回的路上参数进行序列化:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    data: { 
     pkList: [1, 2, 3] 
    }, 
    traditional: true 
}); 
+0

不会默认的模型绑定还可以处理用逗号分隔表单编码数据的列表?就像'data:{pkList:'1,2,3'}'?但除此之外,我使用这种方法来处理我所有的模型序列化,这是JS中更复杂对象的方法。 –

+0

@PaulT。,不,默认的模型联编程序不会接受'data:{pkList:'1,2,3'}'。如果你想处理这样的请求,那么需要自定义模型联编程序,你需要拆分条目然后将每个条目解析回整数。如果目标是将整数数组发送到控制器操作,则不必经历这种痛苦。 –

+0

啊是的,我明白你的意思,只是测试它,它的奇怪,但因为如果你有两个同名的输入,它实际上反序列化到一个列表,只是jQuery的序列化形式发布数据并不处理(即pkList = 1&pkList = 2 works) –

0

Phil Haack在他的博客上有一篇很棒的文章,应该直接指出你的意思。

Model Binding To A List

+0

感谢队友,我之前读,但它并不能帮助我,问题是更上了jQuery侧:) – Marc