2012-04-11 14 views
8

Tengo el siguiente problema:MVC 3 AJAX de correos, una lista llena de objetos, pero los objetos propiedades están vacías

En un clic de botón que publicar algunos datos al servidor. Mi controlador de acción es el siguiente:

public ActionResult Accept(List<MyViewModel> entries) 
{ 
    //here entries HAS 2 MyViewModel-Instances in it. 
    //The entries are not null, but the values of the instances are! 
    //entries[0].ParamA is null 
} 

Cuando el MyViewModel se ve así:

public class MyViewModel 
{ 
    public string ParamA { get; set; } 
    public string ParamB { get; set; } 
} 

Y el AJAX-Call es la siguientes aparatos:

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, { ParamA: "C", ParamB: "D" }] }; 

$.ajax({ 
    type: 'POST', 
    url: url, 
    cache: false, 
    data: myEntries, 
    dataType: 'text' }); 

lo que ya probé hacer:

  • tipo de datos ha cambiado a 'json'
  • utilizado: tradicional:
  • cierto
  • intentado myEntries var = JSON.stringify (...);
  • intentado var myEntries = {entries: [JSON.stringify ({...}), JSON.stringify ({...})]};
  • igual que el anterior, pero con jQuery.param (..., verdadero);
  • Uso de IEnumerable o MyViewModel [] en lugar de la lista.
  • cualquier combinación de los anteriores

¿Qué estoy haciendo mal aquí?

¡Muchas gracias de antemano por ayudarme!

EDITAR

Mi (Razor) Ver no es interesante en este momento, ya que no tiene nada que ver con nada. NO estoy usando ninguno de los métodos HTML.TextBoxFor (o similar) para llenar myEntries-Variable. En realidad, se llena dinámicamente (porque hay muchas condiciones). Por el bien de la pregunta (y mis propias pruebas) codifiqué la variable. :)

+0

Se puede publicar código de su vista (Razor)? –

+0

Mi vista no tiene nada interesante. Lo aclare en mi pregunta. Vea la sección EDIT – Shion

+0

¡Tengo la respuesta! Lo publicaré tan pronto como pueda (tengo que esperar 8 horas ...) – Shion

Respuesta

12

Con su respuesta y el uso de JSON.stringify método que funciona para mí

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, 
          { ParamA: "C", ParamB: "D" }] }; 

$.ajax({ 
     type: 'POST', 
     url: '/{controller}/{action}', 
     cache: false, 
     data: JSON.stringify(myEntries), 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8' 
    }); 
+0

Parece que olvidé decir que usé JSON.stringify también. Gracias por señalar eso. – Shion

+0

Gracias, tuve el mismo problema de que mi lista se llenara pero todas sus propiedades estaban vacías. Estaba usando $ .Post (..) que pensé que sería una envoltura alrededor de $ .ajax (escriba: 'POST', ...), pero debe haber alguna diferencia ya que usar el ejemplo $ .ajax anterior funciona muy bien . –

+0

Solo quiero enfatizar que la configuración de contentType a 'application/json' es crítica. ¡En mi caso simplemente no funcionó sin esto! –

5

¡Tengo la respuesta!

jQuery puede ser confuso a veces.

dataType es el parámetro que especifica qué desea obtener BACK del servidor. contentType es el parámetro que especifica qué ENVÍA AL servidor.

Así en el ejemplo anterior funciona si se agrega:

contentType: 'application/json; charset = utf-8 ',

en la llamada AJAX.

1

Sólo para complementar la respuesta sobre cómo crear la lista que va a ser puesto de nuevo al controlador. Eso es porque no necesita envolver la matriz con el nombre de la lista.Se ve feo y no es manejable usando funciones integradas. Este ejemplo está aquí para mostrar cómo publicar de vuelta JSON que MVC entenderá e interpretará como una Lista de. (Pero incluso si la matriz está envuelta, sigue funcionando, pero eso es contenido estático y es difícil de administrar)

Este ejemplo usó el complemento ordenable de jQuery. Quiero publicar todo el modelo de la lista con los nuevos índices de pedidos para guardar en la base de datos.

update: function (event, ui) { 

img = { key: 0, order: 0, url: '' }; //Single image model on server 
imgs = new Array(); //An array to hold the image models. 

//Iterate through all the List Items and build my model based on the data. 
$('#UploaderThumbnails li').each(function (e) { 
     img.key = $(this).data('key'); //Primary Key 
     img.order = $(this).index(); //Order index 
     imgs.push(img); //put into "list" array 
}); 

//And what is in the answer - this works really great 
$.ajax({ 
    url: '/Image/UpdateOrder', 
    data: JSON.stringify(imgs), 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8' 
    }); 

} 

Y mi controlador MVC es tan simple como ...

[HttpPost] 
    public ActionResult UpdateOrder(List<Models.Image> images) 
    { 
    //Images at this point is a proper C# List of Images! :) Easy! 

     return Content(""); 
    } 
+0

Esto funcionó para mí. Y solo para reiterar, ¡no olvide ese tipo de contenido de aplicación/json! – K0D4

Cuestiones relacionadas