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