recibir receive parameter net mvc frombody asp asp.net-mvc json asp.net-mvc-3 model-binding

receive - ASP.Net MVC 3-Enlace del modelo JSON a la matriz



recibir json mvc (3)

Estoy en ASP.Net MVC 3, y siguiendo la lista de características admitida en, debería poder obtener el enlace del modelo json predeterminado trabajando fuera de la caja. Sin embargo, no he logrado vincular una matriz / colección de json al parámetro del método de acción. Aunque conseguí el enlace simple de objetos json funcionando bien. Apreciaría enormemente si un experto aquí pudiera decirme qué estoy haciendo mal.

Aquí está el código:

Código del lado del servidor primero:

// Método de acción

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 }

Verifiqué la carga json en fiddler y se ve 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, veo que los IList<Discount> se han completado con 3 objetos de Discount vacíos, lo que significa que las propiedades son nulas, pero la longitud del argumento de descuentos es 3.


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

Así que modificando la clase de Discount como se muestra a continuación resolví esto

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


Tu código se ve bien .. Pero mira esto

  1. Configuración de enrutamiento.
  2. Ponga el atributo [HttpPost] en SaveDiscount

y prueba esto

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

Eso daría derecho a enlace de datos.


mientras respondió a esta pregunta en particular, tuve los mismos síntomas y una configuración muy similar.

en lugar del public o { get; set; } { get; set; } { get; set; } en mis modelos haciendo que el enlace del modelo no funcione, en realidad fue mi método jQuery . (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 Form.Data [], pero no se asignan correctamente.

Trabajos:

$.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.

Perdió unas horas a este, espero que esto ayude a otros.