通过AJAX将数组传递给mvc Action

时间:2011-03-30 16:52:05

标签: c# asp.net-mvc jquery

我正在尝试将通过AJAX的int(或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,以便控制器可以识别它是什么?

非常感谢你的帮助

戴夫

11 个答案:

答案 0 :(得分:146)

在进行get调用之前将traditional属性设置为true。 即:

jQuery.ajaxSettings.traditional = true

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

答案 1 :(得分:110)

我在尝试执行POST时遇到过问题(不确定这是否与您正在进行的操作完全相同,但我记得在传入数组时,传统必须设置为true

 var arrayOfValues = new Array();

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

答案 2 :(得分:48)

相对较晚,但不同回答已经存在的那些:

如果您想使用速记函数$.get$.post代替$.ajax,则可以通过这种方式传递数组:


速记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
}


注意:

答案 3 :(得分:9)

使用“传统”选项的答案是正确的。我只是为希望了解更多内容的人提供更多背景信息。

来自jQuery文档:

  

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

您还可以在此处阅读更多内容: http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answershttp://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

HTH

答案 4 :(得分:7)

你应该可以做到这一点:

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

然后你的行动方法就是这样:

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

对你来说,看起来你只需要对你的值进行字符串化。 MVC中的JSONValueProvider会将它转换回IEnumerable。

答案 5 :(得分:2)

如果所有失败......

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

我最终在different SO post找到了我的解决方案,实际上非常简单:只需在控制器中的数组参数之前添加[FromUri]注释(我也必须拨打电话使用“传统”AJAX设置来避免括号注释)。 请参阅下面的我在我的应用程序中使用的实际代码。

控制器签名:

Controller Signature 注意:C#中的注释将是 [FromUri]

的JavaScript:

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

实际网址字符串:

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

答案 6 :(得分:0)

如果您使用的是 ASP.NET Core MVC ,并且需要处理方括号(而不是使用jQuery的“传统”选项),那么我发现的唯一选择是手动构建控制器方法中的IEnumerable

string arrayKey = "p[]=";
var pArray = HttpContext.Request.QueryString.Value
    .Split('&')
    .Where(s => s.Contains(arrayKey))
    .Select(s => s.Substring(arrayKey.Length));

答案 7 :(得分:0)

如果像我以前那样从.Net Framework MVC迁移到ASP.NET Core MVC,则情况会稍有变化。 Ajax调用必须使用stringify在原始对象上进行,因此,与其传递{ vals: arrayOfValues }数据,不如传递JSON.stringify(arrayOfValues)如下:

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

ASP.NET Core中的另一项更改是防止跨站点请求伪造,因此对于从ajax方法调用MVC操作的行为,[FromBody]属性必须按如下所示应用于操作参数:

public ActionResult MyAction([FromBody] IEnumerable<int> arrayOfValues )

答案 8 :(得分:0)

在这里有点晚了,但是我可以在$ .ajax()中进一步使用SNag的解决方案。这是对任何人都有用的代码:

var array = [1, 2, 3, 4, 5];

$.ajax({
    type: "GET",
    url: '/controller/MyAction',
    data: $.param({ data: array}, true),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
    },
    error: function (x, y, z) {
    }
});

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

答案 9 :(得分:0)

我使用 asp.net core 2.2 和jquery,必须从视图向具有简单数据字段和某些数组的控制器提交复杂的对象(“主类”)。
一旦我在c#'main class'定义中添加了数组(见下文),并通过ajax(发布)提交了(正确填充的)数组,整个对象在控制器中就为空。
首先,我想,我的ajax调用缺少“ traditional:true”是原因,但事实并非如此。
在我的情况下,原因是c#'main class'中的定义。
在“主班”中,我有:

public List<EreignisTagNeu> oEreignistageNeu { get; set; }

和EreignisTagNeu被定义为:

public class EreignisTagNeu
{
 public int iHME_Key { get; set; } 
}

我不得不将“主类”中的定义更改为:

 public List<int> oEreignistageNeu { get; set; }

现在可以使用了。
所以...对我来说,如果数组的列表未在“主类”中完全定义,则asp.net核心似乎有问题(带有帖子)。
注意: 就我而言,无论对ajax调用是否使用“ traditional:true”,这种方法都有效

答案 10 :(得分:-2)

您需要将Array转换为字符串:

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

这甚至以int,long或string

的形式工作
public ActionResult MyAction(int[] arrayOfValues )