【问题标题】:pass array of numbers from ajax to controller将数字数组从 ajax 传递到控制器
【发布时间】:2017-07-21 22:15:42
【问题描述】:

我知道这是一个热门话题,我已经尝试了所有可以找到的解决方案,但均无济于事。我已经使用了这个问题包含的所有解决方案:Pass a List from javascript to controller。我已经将我的测试简化到非常简单。我进入控制器,但我的控制器输入参数是 {int[0]}。我确认我的数组数据在 JavaScript 和 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;
}

【问题讨论】:

  • 尝试将数据设置为{ "ids": selectedIds },否则你发送的是string而不是int[] ex { "ids": "[565, 573, 571]"}
  • 或者(到@Enfyve 评论/回答),它需要是data: JSON.stringify({ ids: selectedIds }),contentType: 'application/json',(并删除traditional: true,)如果你传递一个复杂对象数组,那么这种格式是必要的。

标签: javascript c# ajax asp.net-mvc-3 controller


【解决方案1】:

通过使用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

【讨论】:

  • 我已经尝试过两种方式(如我的问题所示),今天早上我再次尝试使用您的代码,使用 JSON.stringify(selectedIds),typeof(data["ids"] ) 返回未定义。使用 {"ids": selectedIds} 确实会返回一个对象,而 data["ids"][0] 确实会返回 565,但控制器仍会收到一个空数组。
【解决方案2】:

我用:

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 用于替代方法;但是,如果您已经知道数据的格式,那么当您可以以适当的格式开始发送数据时,为什么还要通过使其反序列化数据来对服务器征税呢?
猜你喜欢
  • 2015-09-18
  • 2018-09-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多