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.

¿Fue útil?

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...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top