Отправить список / массив в качестве параметра с помощью jQuery getJson - PullRequest
24 голосов
/ 09 сентября 2010

У меня есть следующее, где я пытаюсь отправить список / массив в метод контроллера 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 ]

39 голосов
/ 09 сентября 2010

Попробуйте установить флаг 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);
}
22 голосов
/ 21 декабря 2011

Помимо вызова .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');
});    
6 голосов
/ 20 октября 2010

К сожалению, хотя кажется, что jquery предоставляет «традиционный» флаг для переключения этого поведения на jQuery.ajax, он не на jQuery.getJSON.Один из способов обойти это - глобально установить флаг:

jQuery.ajaxSettings.traditional = true;

См. Документацию по jQuery.param: http://api.jquery.com/jQuery.param/ Также см.примечания к выпуску для этого изменения: http://jquery14.com/day-01/jquery-14 (поиск «традиционный»)

0 голосов
/ 10 ноября 2015

В представлении сгенерируйте несколько именованных полей (не id, поскольку id должно быть уникальным для каждого поля), отметив использование Name, а не 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...
...