2011-05-17 11 views
11

¿El modelo de carpeta no soporta matrices de objetos JSON? El siguiente código funciona cuando se envía un solo objeto de dominio JSON como parte de la publicación de Ajax. Sin embargo, al enviar una matriz de objetos de dominio JSON, el parámetro de acción es nulo.Contabilización de una matriz de objetos JSON en el método de acción MVC3 a través de jQuery ajax

 var domains = [{ 
         DomainName: 'testt1', 
         Price: '19.99', 
         Available: true 
        }, { 
         DomainName: 'testt2', 
         Price: '15.99', 
         Available: false 
        }]; 

       $.ajax({ 
        type: 'POST', 
        url: Url.BasketAddDomain, 
        dataType: "json", 
        data: domains, 
        success: function (basketHtml) { 

        }, 
        error: function (a, b, c) { 
         alert('A problem ocurred'); 
        } 
      }); 

Este es el método de acción:

public ActionResult AddDomain(IEnumerable<DomainBasketItemModel> domain) 
{ 
    ... 

Cualquier idea si es posible hacer esto?

EDITAR

@Milimetric

funciona su solución! Sin embargo, esto es mi culpa, pero el código que demostré no es el verdadero código de mi problema, estaba tratando de mostrar un código equivalente que sea más fácil de entender.

De hecho, estoy creando una matriz, entonces interating algunos elementos DOM y empujando un objeto JSON sobre la matriz, entonces la publicación de esta matriz como los datos ...

var domains = []; 

       $(this).parents('table').find('input:checked').each(function() { 
        var domain = { 
         DomainName: $(this).parent().parent().find('.name').html(), 
         Price: $(this).parent().parent().find('.price span').html(), 
         Available: $(this).parent().parent().find('.available').html() == "Available" 
        } 

        domains.push(domain); 
       }); 

       $.ajax({ 
        type: 'POST', 
        url: Url.BasketAddDomain, 
        dataType: "json", 
        data: { domain: domains }, 
        success: function (basketHtml) { 

        }, 
        error: function (a, b, c) { 
         alert('A problem ocurred'); 
        } 
       }); 
+0

Relacionados - http://stackoverflow.com/questions/2515773/ajax-post-of-javascript-string-array-to-jsonresult-as -liststring-always-returns – ChrisF

Respuesta

31

Es necesario:

var domains = { domains: [... your elements ...]}; 

      $.ajax({ 
       type: 'post', 
       url: 'Your-URI', 
       data: JSON.stringify(domains), 
       contentType: "application/json; charset=utf-8", 
       traditional: true, 
       success: function (data) { 
        ... 
       } 
      }); 

En general, consulte el objeto Solicitud en el depurador, verá lo que se está pasando y tendrá una idea de cómo "hablar" HTTP.

NOTA: Acabo de descubrir esto. El aglutinante modelo se ahoga con propiedades decimales anulables como:

public decimal? latitude { get; set; } 

Por lo tanto, no se unirá que si usted está enviando a la misma con una cadena JSON que tiene este aspecto:

{"latitude":12.0} 

pero será trabajar si usted pone algo como esto:

{"latitude":"12.0"} 

Ver: http://syper-blogger.blogspot.com/2011/07/hello-world.html

+2

gracias por la respuesta y solución correcta, pero he actualizado mi pregunta – jcvandan

+2

K, edité mi respuesta, creo que la clave es JSON.stringify y contentType: "application/json ..." – Milimetric

+1

funcionó - ¡Eres una leyenda absoluta! – jcvandan

1

Tuve un problema similar. Para resolverlo, tomé un enfoque ligeramente diferente. En lugar de un objeto JSON, utilicé matrices de variables de formulario ocultas. Siempre que los nombres de las variables coincidan, el enlace del modelo funcionó como un amuleto.

function AddDomainBasket(domainName, price, available) { 

    if (typeof AddDomainBasket.counter == 'undefined') { 
     AddDomainBasket.counter = 0; 
    } 

    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].DomainName" value="' + domainName_index + '" />'); 
    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].Price" value="' + price + '" />'); 
    $("#some_form").append('<input type="hidden" name="[' + AddDomainBasket.counter + '].Available" value="' + available + '" />'); 

    ++AddDomainBasket.counter; 
} 

Y a continuación, enviar el formulario serlialized

$(this).parents('table').find('input:checked').each(function() { 
    AddDomainBasket($(this).parent().parent().find('.name').html(), 
        $(this).parent().parent().find('.price span').html(), 
        $(this).parent().parent().find('.available').html() == "Available"); 
       } 
      }); 

$.ajax({ 
    type: 'POST', 
    url: Url.BasketAddDomain, 
    data: $('#some_form').serialize(), 
    success: function (basketHtml) { 
     }, 
     error: function (a, b, c) { 
      alert('A problem ocurred'); 
    } 
}); 
+1

+1 Esto es especialmente útil cuando uno no quiere establecer el tipo de contenido en 'application/json' –

Cuestiones relacionadas