Estoy tratando de pasar una matriz de objetos a un método de controlador MVC usando la función ajax () de jQuery. Cuando entro en el método del controlador PassThing () C #, el argumento "cosas" es nulo. Intenté esto usando un tipo de Lista para el argumento, pero eso tampoco funciona. ¿Qué estoy haciendo mal?
<script type="text/javascript">
$(document).ready(function () {
var things = [
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
];
$.ajax({
contentType: 'application/json; charset=utf-8',
dataType: 'json',
type: 'POST',
url: '/Xhr/ThingController/PassThing',
data: JSON.stringify(things)
});
});
</script>
public class ThingController : Controller
{
public void PassThing(Thing[] things)
{
// do stuff with things here...
}
public class Thing
{
public int id { get; set; }
public string color { get; set; }
}
}
c#
asp.net-mvc
jquery
Martín pescador
fuente
fuente
Respuestas:
Usando la sugerencia de NickW, pude hacer que esto funcionara usando
things = JSON.stringify({ 'things': things });
Aquí está el código completo.Hay dos cosas que aprendí de esto:
Las configuraciones contentType y dataType son absolutamente necesarias en la función ajax (). No funcionará si faltan. Descubrí esto después de mucho ensayo y error.
Para pasar una matriz de objetos a un método de controlador MVC, simplemente use el formato JSON.stringify ({'cosas': cosas}).
¡Espero que esto ayude a alguien más!
fuente
http://localhost:52459/Sales/completeSale?itemsInCart=[{"ItemId":1,"Quantity":"1","Price":3.5}]
ySales.completeSale
estápublic ActionResult completeSale(ItemInCart[] itemsInCart)
anotada comoHttpGet
.data: JSON.stringify(things),
dataType
no es necesario. Si se omite, la función ajax lo resolverá en función de los datos de retorno¿No podrías simplemente hacer esto?
... y marca tu acción con
fuente
Dar formato a sus datos puede ser el problema. Pruebe cualquiera de estos:
O (de ¿Cómo puedo publicar una matriz de cadenas en ASP.NET MVC Controller sin un formulario? )
fuente
Estoy usando una aplicación web .Net Core 2.1 y no pude obtener una sola respuesta aquí para que funcione. Obtuve un parámetro en blanco (si se llamó al método) o un error de servidor 500. Comencé a jugar con todas las combinaciones posibles de respuestas y finalmente obtuve un resultado funcional.
En mi caso la solución fue la siguiente:
Script: secuencia la matriz original (sin usar una propiedad con nombre)
Y en el método del controlador, use [FromBody]
Las fallas incluyen:
Nombrar el contenido
datos: {contenido: nodos}, // Error 500 del servidor
No tener contentType = Error 500 del servidor
Notas
dataType
no es necesario, a pesar de lo que dicen algunas respuestas, ya que se usa para la decodificación de respuesta (por lo que no es relevante para los ejemplos de solicitud aquí).List<Thing>
también funciona en el método del controladorfuente
Tengo la respuesta perfecta para todo esto: probé tantas soluciones que no pude finalmente administrarme, por favor encuentre la respuesta detallada a continuación:
Controlador
fuente
La única forma en que podría hacer que esto funcione es pasar el JSON como una cadena y luego deserializarlo usando
JavaScriptSerializer.Deserialize<T>(string input)
, lo cual es bastante extraño si ese es el deserializador predeterminado para MVC 4.Mi modelo tiene listas anidadas de objetos y lo mejor que pude obtener usando datos JSON es la lista superior para tener el número correcto de elementos, pero todos los campos de los elementos eran nulos.
Este tipo de cosas no debería ser tan difícil.
fuente
Este es un código de trabajo para su consulta, puede usarlo.
Controlador
javascript
fuente
Envolver su lista de objetos con otro objeto que contenga una propiedad que coincida con el nombre del parámetro que espera el controlador MVC funciona. Lo importante es el envoltorio alrededor de la lista de objetos.
fuente
fuente
Si está utilizando ASP.NET Web API, simplemente debe aprobar
data: JSON.stringify(things)
.Y su controlador debería verse así:
fuente
Modificación de @veeresh i
fuente
Lo que hice al intentar enviar algunos datos de varias filas seleccionadas en DataTable a la acción MVC:
HTML al comienzo de una página:
(solo se muestra una fila, enlazar desde el modelo):
Botón que inicia la función de JavaScript:
Función de JavaScript:
Acción MVC:
Y MODELO en C #:
CONCLUSIÓN:
El motivo del ERROR:
Es atributo:
[ValidateAntiForgeryToken]
para la acción MVCStartWorkflow
Solución en llamada Ajax:
Para enviar la Lista de objetos, debe formar datos como en el ejemplo (objeto de lista de llenado) y:
datos: {modelo: lista},
tipo: "publicación",
fuente
Así es como me funciona bien:
Con "ContentType" en mayúscula "C".
fuente