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

Posted

技术标签:

【中文标题】使用 jQuery getJson 发送列表/数组作为参数【英文标题】:Send list/array as parameter with jQuery getJson 【发布时间】:2011-04-10 06:21:51 【问题描述】:

我有以下尝试将列表/数组发送到 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)  

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

【问题讨论】:

【参考方案1】:

尝试设置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 中有一个错误,请参阅forum.jquery.com/topic/… 这不是错误。与之前的版本相比,这是一个重大变化。这就是他们引入traditional 参数的原因。【参考方案2】:

除了像 Darin 建议的那样调用 .ajax() 而不是 .getJSON() 或按照 jrduncans 的建议将全局 jQuery.ajaxSettings.traditional 设置为 true 之外,您还可以在您的 params 对象上传递调用 the jQuery .param() function 的结果:

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');
);    

【讨论】:

是的,我同意。虽然 Darin 指出了传统的标志(你太棒了,不要误会我的意思),这个答案让你使用 getJson,这正是 OP 想要的。【参考方案3】:

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

jQuery.ajaxSettings.traditional = true;

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

【讨论】:

【参考方案4】:

在视图中,生成multiple named fields(不是id,因为id每个字段应该是唯一的),注意Name not 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...

【讨论】:

以上是关于使用 jQuery getJson 发送列表/数组作为参数的主要内容,如果未能解决你的问题,请参考以下文章

getjson jquery解析数组

jQuery getJSON 不发送 cookie

jQuery $.getJSON 和遍历数组正在倾尽全力

在 Flask 应用程序中通过 jquery (getjson) 在字典中发送 Plotly 图表

jQuery中$.getJSON

jQuery之getjson信息展示