2011-10-28 12 views
14

Cuando envío una lista de de int con jQuery así:¿Cómo enviar una lista de int con jQuery para ASP.net MVC Modelo predeterminado Carpeta

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

Entonces jQuery transformará el objeto pkList y enviarlo por post como este:

pkList[]:1 
pkList[]:2 
pkList[]:3 

que estaría bien si el servidor es PHP pero yo uso Asp.NET MVC3 y tratar de conseguir estos valores con el modelo por defecto ligante:

public ActionResult Execute(ICollection<int> pkList) 

Pero pkList siempre es nulo, parece que el archivador de modelo predeterminado no puede vincularlo.

¿Cómo resuelvo esto correctamente?


AÑADIDOSOLUCIÓN

he utilizado la solución de Darin Dimitrov con la configuración de la opción traditional en jQuery:

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    traditional: true, 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

Ahora jQuery no agrega el [] a los parámetros más y se envían así:

pkList:1 
pkList:2 
pkList:3 

Y el encuadernador de modelo predeterminado MVC obtiene los valores correctamente.

Espero que esto ayude a alguien.

Respuesta

16

Se puede usar una solicitud JSON, ya que le permitirá enviar los objetos complejos que desea:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ pkList: [1, 2, 3] }), // you could throw any javascript object you like here 
    success: function(result) { 
     // process the results 
    } 
}); 

El método JSON.stringify se construye en los navegadores modernos y si quieres apoyar legado navegadores, puede incluir el script json2.js en su sitio.

Y para responder a su pregunta podría utilizar establecer la opción traditional: true para indicar a jQuery para el repliegue a tradicional serialización de los parámetros ya que esto ha cambiado en jQuery 1.4 y si está utilizando una versión posterior tiene la posibilidad de cambiar de nuevo a los parámetros de forma serializada son:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    data: { 
     pkList: [1, 2, 3] 
    }, 
    traditional: true 
}); 
+0

no será el aglutinante de modelo por defecto también se encargan listas separadas por comas de datos codificados por formulario también? Algo como 'data: {pkList: '1,2,3'}'? Pero de lo contrario, uso este método para toda la serialización de modelos, el camino a seguir para objetos más complejos en JS. –

+0

@PaulT., No, el archivador de modelo predeterminado no aceptará 'datos: {pkList: '1,2,3'}'. Si desea manejar tales solicitudes, será necesario un archivador de modelo personalizado en el que necesite dividir las entradas y luego analizar cada una de nuevo en un entero.No sería necesario pasar por este dolor si el objetivo es enviar una matriz de enteros a una acción de controlador. –

+0

ah sí veo lo que quieres decir ahora, simplemente lo probé, aunque es extraño porque si tienes dos entradas con el mismo nombre, eso realmente deserializa eso a una lista, solo la serialización de jQuery para formar datos de correos no maneja eso (es decir, .pkList = 1 & pkList = 2 funciona) –

0

Phil Haack tiene un gran artículo en su blog que debe señalarle en la dirección correcta.

Model Binding To A List

+0

Gracias compañero, he leído que antes, pero no me ayuda, el problema era más en el lado jQuery :) – Marc

Cuestiones relacionadas