如何通过Ajax将集合/数组发送到MVC操作

7

目前我正在尝试这样做,但没有成功,我的Do操作返回null。

var arr = [31,17,16];

$.get('<%=Url.Action("Do", "Foo") %>', 
       {ids:arr},
       function(d){...});

public ActionResult Do(IEnumerable<int> ids)
{
...
}

你确定数值已经被发送了吗?使用浏览器的开发者工具来检查请求头。 - Jonas Van der Aa
2个回答

6
试试这样做:
$.ajax({
    url: '<%= Url.Action("Do", "Foo") %>',
    data: { ids: [ 31, 17, 16] },
    traditional: true,
    success: function(result) {

    }
});

请注意 traditional: true 参数。 或者如果您坚持使用 $.get() 函数:
$.get(
    '<%= Url.Action("Do", "Foo") %>', 
    $.param({ ids: [31, 17, 16] }, true), 
    function (result) {

    }
);

@hunter 这是不带传统的吗? - Omu
1
@Omu,传统是另一个参数,它不是数据哈希的一部分。 - Darin Dimitrov

2

我刚刚遇到了这个问题,但是找到了一种替代解决方案。我更喜欢这种方法,而不是传统的方法,所以我会在这里发布它,让其他人可以自己选择。

$.ajax(url, 
    {
        type: method,                    //"GET", or "POST", etc. The REST verb
        data: JSON.stringify(myData),    //stringify your collection or complex object
        contentType:"application/json",  //tell the controller what to expect
        complete: callback
    });
});

这个方法适用于我发送的每种数据类型,无论多么复杂。我们实际上将其封装在一个名为RequestService的类中,该类为从客户端脚本到MVC API控制器的所有请求执行此操作。还有很多其他不错的属性可以赋予此对象,比如timeoutheaders。请查看完整文档here
我正在运行.NET Framework 4.5和JQuery 1.7.1,尽管我相信自1.5以来已经有了这个$.ajax版本。

在服务器端,您必须手动反序列化myData吗?还是默认的ModelBinder会自动处理? - Omu
只要在使用stringify时指定contentType,框架就会为您处理反序列化。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接