jquery - one - mvc submit button action
Cómo enviar una lista de int con jQuery a ASP.net MVC Default Model Binder (2)
Cuando envío una lista de int con jQuery de esta manera:
$.ajax(''@Url.Action("Execute")'', {
type: ''POST'',
data: {
pkList: [1,2,3]
}
});
Entonces jQuery transformará el objeto pkList y lo enviará por correo de esta manera:
pkList[]:1
pkList[]:2
pkList[]:3
Lo cual estaría bien si el servidor es PHP pero yo uso Asp.NET MVC3 y trato de obtener estos valores con la carpeta de modelo predeterminada:
public ActionResult Execute(ICollection<int> pkList)
Pero pkList siempre es nulo, parece que el archivador de modelo predeterminado no puede vincularlo.
¿Cómo soluciono esto correctamente?
SOLUCIÓN AGREGADA
Usé 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 ya no agrega []
a los parámetros y se envían así:
pkList:1
pkList:2
pkList:3
Y la carpeta de modelo predeterminada de MVC obtiene los valores correctamente.
Espero que esto ayude a alguien.
Phil Haack tiene un gran artículo en su blog que debería señalarte en la dirección correcta.
Puede usar una solicitud JSON ya que le permitirá enviar cualquier objeto complejo que desee:
$.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
está construido en navegadores modernos y si desea admitir navegadores heredados, puede incluir el script json2.js en su sitio.
Y para responder a su pregunta, puede usar establecer la opción traditional: true
para indicarle a jQuery que retroceda a la serialización tradicional de parámetros, ya que esto ha cambiado en jQuery 1.4 y si está utilizando una versión posterior, tiene la posibilidad de volver al modo los parámetros están serializados:
$.ajax({
url: ''@Url.Action("Execute")'',
type: ''POST'',
data: {
pkList: [1, 2, 3]
},
traditional: true
});