Estoy creando una pequeña aplicación para enseñarme ASP.NET MVC y JQuery, y una de las páginas es una lista de elementos en los que se pueden seleccionar algunos. Luego me gustaría presionar un botón y enviar una Lista (o algo equivalente) a mi controlador que contenga los identificadores de los elementos seleccionados, utilizando la función Publicar de JQuery.
Logré obtener una matriz con los identificadores de los elementos que fueron seleccionados, y ahora quiero publicar eso. Una forma de hacerlo es tener un formulario ficticio en mi página, con un valor oculto, y luego establecer el valor oculto con los elementos seleccionados y publicar ese formulario; Sin embargo, esto se ve mal.
¿Hay una forma más limpia de lograr esto, enviando la matriz directamente al controlador? He intentado algunas cosas diferentes, pero parece que el controlador no puede asignar los datos que está recibiendo. Aquí está el código hasta ahora:
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
Y entonces mi controlador se ve así
public ActionResult GenerateList(List<string> values)
{
//do something
}
Todo lo que pude obtener es un "nulo" en el parámetro del controlador ...
¿Algun consejo?
fuente
Request["values[]"]
Respuestas:
Modifiqué mi respuesta para incluir el código de una aplicación de prueba que hice.
Actualización: He actualizado jQuery para establecer la configuración 'tradicional' en verdadero para que esto funcione nuevamente (según la respuesta de @DustinDavis).
Primero el javascript:
Y aquí está el código en mi clase de controlador:
Cuando llamo a esa función de JavaScript, recibo una alerta que dice "Primer elemento de la lista: 'elemento1'". ¡Espero que esto ayude!
fuente
dataType: 'JSON'
hace que jQuery intente analizar la respuesta como JSON y generará un error si no es JSON válido.dataType: 'json'
es para el tipo de retorno y no es necesario para enviar la matriz a Action.contentType: "application/json; charset=utf-8"
, es el indicado, pero en algunos casos como este no es obligatorio.var postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
FYI: JQuery cambió la forma en que serializan los datos de la publicación.
http://forum.jquery.com/topic/nested-param-serialization
Debe establecer la configuración 'Tradicional' en verdadero, de lo contrario
saldrá como
en vez de
fuente
$.ajax({ ..., traditional: true});
ayudará a volver a la serialización tradicional.ints
. Cuando lo usotraditional: true
, funciona, su respuesta y enlace explican por qué . También funciona cuando lo usotype: "POST"
, sin usartraditional: true
. ¿Porqué es eso? ¿Podría por favor dar más detalles? FYI estoy usando Asp.Net Mvc.Gracias a todos por las respuestas. Otra solución rápida será usar el método jQuery.param con el parámetro tradicional establecido en verdadero para convertir el objeto JSON en una cadena:
fuente
No publique los datos como una matriz. Para enlazar a una lista, los pares clave / valor deben enviarse con el mismo valor para cada clave.
No debería necesitar un formulario para hacer esto. Solo necesita una lista de pares clave / valor, que puede incluir en la llamada a $ .post.
fuente
en
.NET4.5
,MVC 5
Javascript:
objeto en JS:
mecanismo que publica.
C#
Objetos:
Controlador:
Objeto recibido:
Espero que esto te ahorre algo de tiempo.
fuente
Otra implementación que también funciona con una lista de objetos, no solo cadenas:
JS:
Asumiendo que 'selectedValues' es Array of Objects.
En el controlador, el parámetro es una lista de ViewModels correspondientes.
fuente
Como discutí aquí ,
si desea pasar un objeto JSON personalizado a la acción MVC, puede usar esta solución, funciona de maravilla.
El beneficio real de esta solución es que no necesita definir una nueva clase para cada combinación de argumentos y, además, puede convertir sus objetos a sus tipos originales fácilmente.
Puede utilizar un método auxiliar como este para facilitar su trabajo:
fuente
Puede configurar el parámetro global con
fuente
La respuesta me ayudó mucho en mi situación, así que gracias por eso. Sin embargo, para futuras referencias, las personas deben unirse a un modelo y luego validar. Esta publicación de Phil Haack describe esto para MVC 2. http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
Espero que esto ayude a alguien.
fuente