使用jQuery getJson发送数组或列表作为参数

26

我有以下代码,在其中我试图将列表/数组发送到MVC控制器方法:

var id = [];
var inStock = [];

$table.find('tbody>tr').each(function() {
    id.push($(this).find('.id').text());
    inStock.push($(this).find('.stocked').attr('checked'));
});

var params = {};
params.ids = id;
params.stocked = inStock; 

$.getJSON('MyApp/UpdateStockList', params, function() {
    alert('finished');
});    

在我的控制器中:

public JsonResult UpdateStockList(int[] ids, bool[] stocked) { }

两个参数都是 null。

请注意,如果我将这些参数更改为单个项目

params.ids = 1;
params.stocked = true; 

public JsonResult UpdateStockList(int ids, bool stocked) { }

那么它可以正常工作,所以我不认为这是一个路由问题。

4个回答

42

尝试设置traditional标志:

$.ajax({
    url: '/home/UpdateStockList',
    data: { ids: [1, 2, 3], stocked: [true, false] },
    traditional: true,
    success: function(result) {
        alert(result.status);
    }
});

可以正常运行:

public ActionResult UpdateStockList(int[] ids, bool[] stocked)
{
    return Json(new { status = "OK" }, JsonRequestBehavior.AllowGet);
}

天才,谢谢!似乎在1.4.2版本的getJson中存在一个错误,请参见http://forum.jquery.com/topic/getjson-breaks-with-1-4-2-when-parameter-argument-is-an-array。 - fearofawhackplanet
2
这不是一个错误,而是与之前版本不兼容的重大更改。这就是为什么他们引入了“traditional”参数的原因。 - Darin Dimitrov

24
除了像Darin建议的那样调用.getJSON()而不是.ajax(),或者像jrduncans建议的那样将全局jQuery.ajaxSettings.traditional设置为true,您还可以将调用jQuery .param()函数的结果传递给您的params对象:
var id = [];
var inStock = [];

$table.find('tbody>tr').each(function() {
    id.push($(this).find('.id').text());
    inStock.push($(this).find('.stocked').attr('checked'));
});

var params = {};
params.ids = id;
params.stocked = inStock; 

$.getJSON('MyApp/UpdateStockList', $.param(params, true), function() {
    alert('finished');
});    

1
是的,我同意。虽然 Darin 指出了传统标志(你很棒,不要误会),但这个答案让你使用 getJson,这正是 OP 想要的。 - Danny van der Kraan

6

不幸的是,虽然在jQuery.ajax中似乎提供了一个“传统”标志来切换此行为,但在jQuery.getJSON中没有。解决此问题的一种方法是全局设置该标志:

jQuery.ajaxSettings.traditional = true;

请参阅jQuery.param的文档:http://api.jquery.com/jQuery.param/ 还请查看此更改的发布说明:http://jquery14.com/day-01/jquery-14(搜索“traditional”)


0
在视图中,生成多个命名字段(不是id,因为每个字段的id应该是唯一的),注意使用{{link2:Name而不是name}}:
@foreach (var item in Model.SomeDictionary)
{
    @Html.TextBoxFor(modelItem => item.Value.SomeString, new { Name = "someString[]" })
}

然后使用jQuery检索输入字段的值,so

var myArrayValues = $('input[name="someString[]"]').map(function () { return $(this).val(); }).get();

您可以直接在jQuery / AJAX中使用如下:

$.ajax({
    type: "POST",
    url: "/MyController/MyAction",
    dataType: 'json',
    data: {
        someStrings: $('input[name="someString[]"]').map(function () { return $(this).val(); }).get(),
        someDates: $('input[name="someDate[]"]').map(function () { return $(this).val(); }).get(),

然后在MVC中的控制器操作中:

[HttpPost]
public JsonResult MyAction(string[] someStrings, DateTime[] someDates...

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