Enviar lista / array como parámetro con jQuery getJSON
-
01-10-2019 - |
Pregunta
Tengo el siguiente donde estoy tratando de lista, enviar / matriz al método 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 controlador de:
public JsonResult UpdateStockList(int[] ids, bool[] stocked) { }
ambos Paramaters son nulos.
Tenga en cuenta que si cambio de los parametros a los 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.
Solución
Trate de establecer el indicador 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);
}
Otros consejos
Además de llamar .ajax()
en lugar de .getJSON()
como sugiere Darin o establecer el jQuery.ajaxSettings.traditional
global para true
como jrduncans sugiere, también puede pasar el resultado de llamar la función jQuery .param()
en el 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');
});
Lamentablemente, si bien parece que jQuery ofrece una bandera "tradicional" para cambiar este comportamiento en jQuery.ajax, no lo hace en jQuery.getJSON. Una forma de evitar esto haría que se establezca el indicador de nivel mundial:
jQuery.ajaxSettings.traditional = true;
Consulte la documentación de jQuery.param: http://api.jquery.com/jQuery.param / consulta las notas de la versión para este cambio: http://jquery14.com/day-01/jquery- 14 (búsqueda de 'tradicional')
En la vista, generar llamado (no id
, como id
debe 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[]" })
}
A continuación, recuperar los valores de campo de entrada utilizando jQuery, así:
var myArrayValues = $('input[name="someString[]"]').map(function () { return $(this).val(); }).get();
Se puede utilizar esta 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(),
A continuación, en la acción del controlador en MVC:
[HttpPost]
public JsonResult MyAction(string[] someStrings, DateTime[] someDates...