2010-09-09 10 views
23

tengo el siguiente donde estoy tratando de lista, enviar/matriz al método controlador MVC:Lista de envío/array como parámetro con jQuery getJSON

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) { } 

tanto los parámetros 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.

Respuesta

39

Intente configurar 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); 
} 
+0

genio, ¡gracias! Parece que hay un error en getJson con 1.4.2, ver http://forum.jquery.com/topic/getjson-breaks-with-1-4-2-when-parameter-argument-is-an-array – fearofawhackplanet

+2

Esto no es un error. Es un cambio radical con respecto a la versión anterior. Es por eso que introdujeron el parámetro 'tradicional'. –

+0

te quiero, hombre – heisenberg

6

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 sería establecer la bandera globalmente:

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')

18

Además llamando .ajax() en lugar de .getJSON() como Darin sugiere o la creación de lo global a jQuery.ajaxSettings.traditionaltrue como jrduncans sugiere, también puede pasar el resultado de llamar the jQuery .param() function en su params objeto:

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'); 
});  
+2

Esta debería ser la respuesta aceptada. –

+1

Sí, estoy de acuerdo. Si bien Darin señaló la bandera tradicional (eres asombroso, no me malinterpretes), esta respuesta te permite usar getJson, que es lo que OP quería. –

0

en la vista, generar multiple named fields (no id, como id debe ser único por campo), teniendo en cuenta el uso de Name not name:

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

a continuación, recuperar los valores de los campos de entrada utilizando jQuery, so:

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

Se puede usar esta directamente en jQuery/AJAX como sigue:

$.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... 
Cuestiones relacionadas