c# - objects - Pase array a mvc Acción a través de AJAX
send array ajax asp net mvc (7)
SI TODO LO DEMÁS FALLA...
Ninguna de las otras respuestas aquí resolvió mi problema. Estaba intentando hacer una llamada al método GET desde JavaScript a un controlador de la API web de MVC, y enviar una matriz de enteros como un parámetro dentro de esa solicitud. Intenté todas las soluciones aquí, pero aún el parámetro en mi controlador venía NULL (o nada para los usuarios de VB).
Eventualmente encontré mi solución en una publicación SO diferente , y en realidad fue muy simple: simplemente agregue la anotación [FromUri]
antes del parámetro de matriz en el controlador ( también tuve que hacer la llamada usando la configuración AJAX "tradicional" para evitar el paréntesis anotaciones ). Vea a continuación el código real que utilicé en mi solicitud.
Firma del controlador:
NOTA: la anotación en C # sería [FromUri]
JavaScript:
$.get(''/api/InventoryApi/GetBalanceField'', $.param({productIds: [42], inventoryFormId: 5493, inventoryBalanceType: ''Beginning''},true)).done(function(data) {console.log(data);});
Cadena de URL real:
http://randomhostname/api/InventoryApi/GetBalanceField?productIds=42&inventoryFormId=5493&inventoryBalanceType=Beginning
Estoy intentando pasar una matriz (o IEnumerable) de entradas desde AJAX a una acción de MVC y necesito un poco de ayuda.
el javascript es
$.get(''/controller/MyAction'', { vals: arrayOfValues }, function (data) {...
y la acción del controlador es
public ActionResult MyAction(IEnumerable<int> arrayOfValues )
En este momento, la solicitud está formateada como
controller/MyAction?_=1301503418429&arrayOfValues[]=491&arrayOfValues[]=368&arrayOfValues[]=235&arrayOfValues[]=437
Así que estoy casi allí, si quito los corchetes, obtengo la respuesta correcta. ¿Cómo debería pasar esa matriz a mi get para que el controlador pueda reconocer de qué se trata?
Muchas gracias por su ayuda
Dave
Deberías poder hacer esto bien:
$.ajax({
url: ''controller/myaction'',
data: JSON.stringify({
myKey: myArray
}),
success: function(data) { /* Whatever */ }
});
Entonces tu método de acción sería así:
public ActionResult(List<int> myKey)
{
// Do Stuff
}
Para ti, parece que solo necesitas codificar tus valores. JSONValueProvider en MVC lo convertirá de nuevo en un IEnumerable para usted.
Establezca la propiedad tradicional en verdadero antes de realizar la llamada de obtención. es decir:
jQuery.ajaxSettings.traditional = true
$.get(''/controller/MyAction'', { vals: arrayOfValues }, function (data) {...
He tenido problemas en el pasado cuando intento realizar una POST (no estoy seguro de si eso es exactamente lo que está haciendo, pero recuerdo que al pasar una matriz, tradicional debe establecerse en verdadero .
var arrayOfValues = new Array();
//Populate arrayOfValues
$.ajax({
type: "POST",
url: "<%= Url.Action("MyAction","Controller")%>",
datatype: "json",
traditional: true,
data: { ''arrayOfValues'': arrayOfValues }
});
La respuesta para usar la opción ''tradicional'' es correcta. Solo estoy brindando más información de antecedentes para esto que desean aprender más.
De la documentación jQuery:
A partir de jQuery 1.8, el método $ .param () ya no usa jQuery.ajaxSettings.traditional como su configuración predeterminada y tendrá el valor predeterminado en falso.
También puede leer más aquí: http://michaelsync.net/2012/04/05/tips-asp-net-mvc-javascriptserializer-3-questions-and-3-answers y http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
HTH
Necesita convertir Array en cadena:
//arrayOfValues = [1, 2, 3];
$.get(''/controller/MyAction'', { arrayOfValues: "1, 2, 3" }, function (data) {...
esto funciona incluso en forma de int, largo o cadena
public ActionResult MyAction(int[] arrayOfValues )
Una respuesta bastante tardía, pero diferente a las que ya están aquí:
Si en lugar de $.ajax
quieres usar las funciones abreviadas $.get
o $.post
, puedes pasar matrices de esta manera:
Taquigrafía GET
var array = [1, 2, 3, 4, 5];
$.get(''/controller/MyAction'', $.param({ data: array }, true), function(data) {});
// Action Method
public void MyAction(List<int> data)
{
// do stuff here
}
Taquigrafía POST
var array = [1, 2, 3, 4, 5];
$.post(''/controller/MyAction'', $.param({ data: array }, true), function(data) {});
// Action Method
[HttpPost]
public void MyAction(List<int> data)
{
// do stuff here
}
Notas:
- El parámetro booleano en
$.param
es para la propiedadtraditional
, que DEBE sertrue
para que esto funcione .