2011-03-12 14 views
17

Estoy en ASP.Net MVC 3, y pasando por la lista de funciones admitida en at, debería ser capaz de obtener el enlace de modelo json predeterminado funcionando de la caja. Sin embargo, no he tenido éxito en vincular una matriz/colección de json al parámetro del método de acción. A pesar de que obtuve un enlace de objeto json simple, funcionaba bien. Agradecería mucho si un experto aquí pudiera decirme lo que estoy haciendo mal.ASP.Net MVC 3 - Enlace de modelo JSON a la matriz

Aquí está el código:

código del lado del servidor en primer lugar:

// Acción Método

public JsonResult SaveDiscount(IList<Discount> discounts) 
    { 
     foreach(var discount in discounts) 
     { 
     .... 
     } 
    } 

// Ver modelo

public class Discount 
{ 
    string Sku{get; set;} 
    string DiscountValue{get; set;} 
    string DiscountType{get; set;} 

} 

// lado del cliente (jQuery/js):

var discount = {}; 
    var jsondatacoll = []; 
    $('#discountgrid tr').each(function() { 

     sku = $(this).find("td").eq(1).html(); 
     discValue = $(this).find('.discval').val(); 
     discType = $(this).find('.disctype').val(); 

     discount = { Sku: sku, DiscountType: discType, DiscountValue: discValue}; 
     jsondatacoll.push(discount); 
     } 
    }) 
    if (jsondatacoll.length > 0) { 
     var catalogDiscount = JSON.stringify(jsondatacoll); 

     $.ajax(
     { 
      url: '/url/savediscount', 
      type: 'POST', 
      data: catalogDiscount, 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      success: function (data, textStatus, jqXHR) { 
       ...     
      }, 
      error: function (objAJAXRequest, strError) {     
       ... 
      } 
     } 
    ); //ajax 
    } 

lo hice comprobar la carga útil JSON en violinista y parecerse a continuación:

[ 
    {"Sku":"sku1","DiscountType":"type1","DiscountValue":"10"},  
    {"Sku":sku2","DiscountType":"type1","DiscountValue":"12"}, 
    {"Sku":"sku3","DiscountType":"type2","DiscountValue":"40"} 
] 

Y en el lado del servidor que hago ver las IList<Discount> descuentos se ha rellenado con 3 vacías Discount objetos - es decir, las propiedades son nulos pero la longitud del argumento descuentos es 3.

+15

Las propiedades de su modelo deben marcarse como "públicas". ¿Typo o descuido? –

+0

¡guau! eso fue un descuido !!! ¿Te gustaría ingresar esto como respuesta para que yo pueda marcarlo? :) – thanikkal

+5

Gracias a que el resto de tu publicación es correcta (aparte de los "públicos" que faltan), noté que contentType se configuraba junto con JSON.stringify y marcaba la diferencia. Luchado con esto durante horas! ¡Gracias! –

Respuesta

14

Como Cresnet Fresh correctamente señalado en los comentarios a la pregunta, las propiedades del modelo deben marcarse como públicas.

Modificando así la clase Discount como se resolvió a continuación.

public class Discount 
{ 
    public string Sku{get; set;} 
    public string DiscountValue{get; set;} 
    public string DiscountType{get; set;} 

} 
+0

¿Alguien puede explicar (o mejor aún vincular a una explicación) en cuanto a POR QUÉ tiene que ser así? Supongo que porque primero se crea un objeto vacío (de ahí la necesidad de un constructor sin parámetros) y luego se establecen las propiedades, pero prefiero trabajar con hechos, no con suposiciones. – RyanfaeScotland

-1

Su código se ve bien .. pero comprobar esto

  1. configuración de enrutamiento.
  2. Put [HttpPost] atributo en SaveDiscount

y probar este

var catalogDiscount = JSON.stringify({ discounts: jsondatacoll }); 

que daría hacen de enlace de datos correctos.

+0

gracias por respondiendo aquí. como se explica en los comentarios anteriores, me olvidé de marcar públicamente mis propiedades de viewmodel. – thanikkal

11

mientras @thanikkal respondieron a esta pregunta en particular, que tenía los mismos síntomas y una configuración muy similar.

en lugar de la public o { get; set; } en mis modelos causando unión a no funcionar en realidad era mi jQuery método el modelo! (RAWR!)

Estaba usando $.post (que no funcionó) en lugar de $.ajax.


no funciona:

$.post("/Games/Action", 
    { "userId": "1", "listName": [ { "fooId": "2", "barId": "99" } ] }, 
    'json', 
    true 
); 

Los valores están en el Form.Data [], pero no se asignan correctamente.


Obras:

$.ajax(
    { 
     url: '/Games/Action', 
     type: 'POST', 
     data: JSON.stringify({ userId: "1", listName: [ { fooId: 2, barId: 99 } ] }), 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     success: function (data, textStatus, jqXHR) 
     { 
      console.log(data); 
     }, 
     error: function (objAJAXRequest, strError) 
     { 
      console.log(data); 
     } 
    }); 

Todos los valores asignados correctamente.


Perdí unas horas a esta, espero que esto ayude a los demás.

+2

Puedo confirmar que lo anterior es cierto. Estaba usando $ .post y mientras veía una matriz en mi modelo, los valores eran nulos. Cambiar a $ .ajax ha resuelto el problema que parece extraño. Estaba usando MVC 4, jQuery 2.0.2 –

+0

Esto fue un salvavidas. Muchas gracias. –

+0

muchas gracias! ¡Perdí casi 5 horas en esto! – Aviatrix

Cuestiones relacionadas