通过AJAX将数组传递给mvc Action

我试图从AJAX传递一个数组(或IEnumerable)的整数到一个MVC行动,我需要一点帮助。

javascript是

$.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 

和控制器的行动是

 public ActionResult MyAction(IEnumerable<int> arrayOfValues ) 

目前请求被格式化为

 controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437 

所以我快到了,如果我把方括号关掉,我会得到正确的答复。 我应该如何将该数组传递到我的get,以便控制器可以识别它是什么?

非常感谢您的帮助

戴夫

在拨打电话之前将传统属性设置为true。 即:

 jQuery.ajaxSettings.traditional = true $.get('/controller/MyAction', { vals: arrayOfValues }, function (data) {... 

在尝试执行POST时,我遇到了一些问题(不确定这是否正是您正在做的事情,但我记得在传入数组时, 传统必须设置为true

  var arrayOfValues = new Array(); //Populate arrayOfValues $.ajax({ type: "POST", url: "<%= Url.Action("MyAction","Controller")%>", datatype: "json", traditional: true, data: { 'arrayOfValues': arrayOfValues } }); 

对于已经存在的问题来说,这是一个很晚但却不同的答案:

如果不是$.ajax而是想使用速记函数$.get$.post ,则可以这样传递数组:

速记GET

 var array = [1, 2, 3, 4, 5]; $.get('/controller/MyAction', $.param({ data: array }, true), function(data) {}); 

 // Action Method public void MyAction(List<int> data) { // do stuff here } 

速记POST

 var array = [1, 2, 3, 4, 5]; $.post('/controller/MyAction', $.param({ data: array }, true), function(data) {}); 

 // Action Method [HttpPost] public void MyAction(List<int> data) { // do stuff here } 

笔记:

  • $.param的布尔参数是traditional属性, 它必须是true

使用“传统”选项的答案是正确的。 我只是提供一些更多的背景信息,这是谁想要了解更多。

从jQuery文档:

从jQuery 1.8开始,$ .param()方法不再使用jQuery.ajaxSettings.traditional作为默认设置,并且默认为false。

您也可以在这里阅读更多: http : //michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers和http://haacked.com/archive /2008/10/23/model-binding-to-a-list.aspx

HTH

你应该能够做到这一点很好:

 $.ajax({ url: 'controller/myaction', data: JSON.stringify({ myKey: myArray }), success: function(data) { /* Whatever */ } }); 

那么你的行动方法就是这样:

 public ActionResult(List<int> myKey) { // Do Stuff } 

对你来说,看起来你只需要将你的价值观串联起来。 MVC中的JSONValueProvider会将它转换回IEnumerable。

IF ALL ELSE FAILS …

这里没有其他的答案解决了我的问题。 我正试图从JavaScript调用一个MVC Web API控制器的GET方法,并在该请求中发送一个整数数组作为参数。 我尝试了所有的解决scheme,但仍然在我的控制器上的参数是NULL(或VB为您的用户)。

我最终发现我的解决scheme在一个不同的SO后 ,其实很简单:只需在控制器中的数组参数之前添加[FromUri]注释( 我也必须使用“传统”AJAX设置进行调用,以避免括号注释 )。 请参阅下面的我的应用程序中使用的实际代码。


控制器签名:

控制器签名 注:在C#中的注释将是 [FromUri]


JavaScript的:

 $.get('/api/InventoryApi/GetBalanceField', $.param({productIds: [42], inventoryFormId: 5493, inventoryBalanceType: 'Beginning'},true)).done(function(data) {console.log(data);}); 

实际的url字串:

 http://randomhostname/api/InventoryApi/GetBalanceField?productIds=42&inventoryFormId=5493&inventoryBalanceType=Beginning 

你需要将数组转换为string:

 //arrayOfValues = [1, 2, 3]; $.get('/controller/MyAction', { arrayOfValues: "1, 2, 3" }, function (data) {... 

这甚至以int,long或string的forms工作

 public ActionResult MyAction(int[] arrayOfValues )