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) { }

两个参数都为空。

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

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

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

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

4

4 回答 4

41

尝试设置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);
}
于 2010-09-09T13:42:33.150 回答
23

除了像 Darin 建议的那样调用.ajax()而不是像 jrduncans 建议的那样将 global设置为之外,您还可以传递在对象上调用jQuery函数结果:.getJSON()jQuery.ajaxSettings.traditionaltrue.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');
});    
于 2011-12-21T10:33:19.653 回答
6

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

jQuery.ajaxSettings.traditional = true;

请参阅 jQuery.param 的文档:http ://api.jquery.com/jQuery.param/ 另请参阅此更改的发行说明:http: //jquery14.com/day-01/jquery-14(搜索 '传统的')

于 2010-10-20T17:47:34.003 回答
0

在视图中,生成多个命名字段(not idid每个字段应该是唯一的),注意Namenotname的使用:

@foreach (var item in Model.SomeDictionary)
{
    @Html.TextBoxFor(modelItem => item.Value.SomeString, new { Name = "someString[]" })
}

然后使用 jQuery 检索输入字段值,因此

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...
于 2015-11-10T14:58:50.223 回答