2011-05-17 8 views
11

Czy łącznik modelu nie obsługuje tablic obiektów JSON? Poniższy kod działa podczas wysyłania pojedynczego obiektu domeny JSON jako części posta ajaxowego. Jednak podczas wysyłania tablicy obiektów domeny JSON parametr działania ma wartość null.Umieszczanie tablicy obiektów JSON w metodzie akcji MVC3 za pomocą 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'); 
        } 
      }); 

Jest to metoda działania:

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

Wszelkie pomysły, czy jest możliwe, aby to zrobić?

EDIT

@Milimetric

Twoje rozwiązanie działa! Jednak to moja wina, ale kod, który zademonstrowałem, nie jest prawdziwym kodem mojego problemu, starałem się pokazać równoważny kod, który jest łatwiejszy do zrozumienia.

Jestem rzeczywiście tworząc tablicę, a następnie interating kilka elementów DOM i przesuwając obiekt JSON na tablicy, a następnie opublikowania tej tablicy jako dane ...

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

pokrewne - http://stackoverflow.com/questions/2515773/ajax-post-of-javascript-string-array-to-jsonresult-as -liststring-zawsze-zwraca – ChrisF

Odpowiedz

31

potrzebował:

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) { 
        ... 
       } 
      }); 

Ogólnie rzecz biorąc, sprawdź obiekt żądania w debugerze, zobaczysz, co jest przekazywane i dowiesz się, jak "mówić" HTTP.

UWAGA: Właśnie to znalazłem. Model spoiwo dławiki na pustych właściwościach przecinku jak:

public decimal? latitude { get; set; } 

Więc nie zwiąże, że jeśli delegowania do niego z ciągiem JSON, który wygląda tak:

{"latitude":12.0} 

ale będzie działa, jeśli po coś takiego:

{"latitude":"12.0"} 

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

+2

dzięki za odpowiedź - i prawidłowe rozwiązanie, ale zaktualizowałem moje pytanie – jcvandan

+2

K, zredagowałem moją odpowiedź, myślę, że kluczem jest JSON.stringify i contentType: "application/json ..." – Milimetric

+1

pracował - jesteś absolutną legendą! – jcvandan

1

Miałem podobny problem. Aby to rozwiązać, zastosowałem nieco inne podejście. Zamiast obiektu JSON użyłem tablic ukrytych zmiennych formularzy. Dopóki nazwy zmiennych były zgodne, powiązanie modelu działało jak czar.

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; 
} 

a następnie przesłać formularz 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 Jest to szczególnie przydatne, gdy nie chcemy ustawić typu zawartości na "application/json" –

Powiązane problemy