tipo por parámetros parametros objeto net mvc llamar lista enviar desde controlador asp arreglo array asp.net-mvc jquery parameter-passing getjson url-parameters

asp.net mvc - por - Enviar lista/matriz como parámetro con jQuery getJson



llamar a un controlador desde javascript mvc (4)

Además de llamar a .ajax() lugar de .getJSON() como sugiere Darin o configurar jQuery.ajaxSettings.traditional a true como sugiere jrduncans, también puede pasar el resultado de llamar a la función .param() jQuery en su objeto 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''); });

Tengo lo siguiente donde trato de enviar la lista / matriz al método del controlador 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''); });

en mi contoller:

public JsonResult UpdateStockList(int[] ids, bool[] stocked) { }

ambos paramaters son nulos

Tenga en cuenta que si cambio los parámetros a elementos individuales

params.ids = 1; params.stocked = true; public JsonResult UpdateStockList(int ids, bool stocked) { }

entonces funciona bien, así que no creo que sea un problema de enrutamiento.


Desafortunadamente, aunque parece que jquery proporciona una marca "tradicional" para alternar este comportamiento en jQuery.ajax, no lo hace en jQuery.getJSON. Una forma de evitar esto sería establecer la bandera globalmente:

jQuery.ajaxSettings.traditional = true;

Consulte la documentación de jQuery.param: http://api.jquery.com/jQuery.param/ Consulte también las notas de la versión de este cambio: http://jquery14.com/day-01/jquery-14 (busque '' tradicional'')


En la vista, genere múltiples campos con nombre (no id , ya que id debería ser único por campo), teniendo en cuenta el uso de Name no name :

@foreach (var item in Model.SomeDictionary) { @Html.TextBoxFor(modelItem => item.Value.SomeString, new { Name = "someString[]" }) }

Luego recupere los valores del campo de entrada usando jQuery, so :

var myArrayValues = $(''input[name="someString[]"]'').map(function () { return $(this).val(); }).get();

Puede usar esto directamente en jQuery / AJAX de la siguiente manera:

$.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(),

Luego en la acción del controlador en MVC:

[HttpPost] public JsonResult MyAction(string[] someStrings, DateTime[] someDates...


Intenta poner la bandera traditional :

$.ajax({ url: ''/home/UpdateStockList'', data: { ids: [1, 2, 3], stocked: [true, false] }, traditional: true, success: function(result) { alert(result.status); } });

funciona bien con:

public ActionResult UpdateStockList(int[] ids, bool[] stocked) { return Json(new { status = "OK" }, JsonRequestBehavior.AllowGet); }