将数组从ajax传递到控制器

问题描述:

我知道这是一个热门话题,我尝试了所有可以找到的解决方案,但都无济于事。我已经使用了包含这个问题的所有解决方案:Pass a List from javascript to controller。我简化了我的测试,简单得可笑。我进入控制器,但我的控制器输入参数是{int [0]}。我确认了我的数组数据在JavaScript和ajax调用中看起来不错。将数组从ajax传递到控制器

任何人都可以告诉我我失踪了吗?

JavaScript代码

var selectedIds = []; 
selectedIds.push(565); 
selectedIds.push(573); 
selectedIds.push(571); 
// selectedIds = [565, 573, 571] 

$.ajax({ 
    type: "POST", 
    traditional: true, 
    dataType: "json", 
    data: { "ids": JSON.stringify(selectedIds) }, 
    //data: { "ids": selectedIds}, 
    //data: { ids: selectedIds}, 
    url: "api/services/getbuildingsbyid", 
    success: function (result) { 
     return result; 
    } 
}); 

控制器代码

[HttpPost] 
public bool GetBuildingsById(int[] ids) 
{ 
    var lookAtIds = ids;  // {int[0]} 
    return true; 
} 
+1

尝试设置数据为'{“ids”:selectedIds}'否则你发送一个字符串而不是'int []'ex'{“ids”:“ [565,573,571]“}' – Enfyve

+2

或者(@Enfyve co它必须是'data:JSON.stringify({ids:selectedIds})','contentType:'application/json','(并删除'traditional:true,'),如果你传递一个复杂对象数组,那么这种格式是必要的。 –

通过使用JSON.stringify(selectedIds)你正在转向的int阵列到所述阵列的字符串表示。

的AJAX POST结束了,像这样:

{ "ids": "[565, 573, 571]" } 

,而不是

{ "ids": [565, 573, 571] } 

相反,如果你只是使用的数据的变量,应该可以解决这个问题:

data: { "ids": selectedIds }, 

编辑-

工作向后,由变量设置为数据,我们可以看到如下:

var data = {"ids": JSON.stringify(selectedIds)} 
typeof(data["ids"]) // string 
data["ids"][0]  // '[' 

data = {"ids": selectedIds} 
typeof(data["ids"]) // object 
data["ids"][0]  // 565 
+0

我试过两种方法(如我的问题所示),今天早上我再次尝试使用你的代码,使用JSON.stringify(selectedIds),typeof(data [“ids”])返回undefined。使用{“ids”:selectedIds}确实返回一个对象,data [“ids”] [0]确实返回565,但控制器仍然收到一个空数组。 – Patricia

我用:

public ActionResult GetBuildingsById(String selectedIds) 
{ 
    // this line convert the json to a list of your type, exactly what you want. 
    IList<int> Ids = new JavaScriptSerializer().Deserialize<IList<int>>(selectedIds);  
    return Content(ids[0].ToString()); 
} 

这将带您selectedIds = [565,573,571] 并创建你的类型列表

+1

+1替代方法;但是如果您已经知道数据的格式,那么为什么通过使服务器能够反序列化数据,然后以适当的格式发送数据以开始使用,从而对服务器征税呢? – Enfyve