使用 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 发送列表/数组作为参数的主要内容,如果未能解决你的问题,请参考以下文章