Подтвердить что ты не робот

Отправить список/массив как параметр с помощью 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) { }

тогда он работает нормально, поэтому я не думаю, что это проблема маршрутизации.

4b9b3361

Ответ 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...