Отправить список/массив как параметр с помощью jQuery getJson
У меня есть следующее, где я пытаюсь отправить список/массив методу контроллера 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);
}
Ответ 2
Помимо вызова .ajax()
вместо .getJSON()
, поскольку Дарин предлагает или устанавливает глобальный jQuery.ajaxSettings.traditional
в true
, как предлагает jrduncans, вы также можете передать результат вызова функция 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');
});
Ответ 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
В представлении сгенерируйте несколько именованных полей (не id
, поскольку id
должно быть уникальным для каждого поля), отметив использование Name
not Name
:
@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...