2012-04-11 15 views
8

Mam następujący problem:MVC 3 AJAX Post, Lista wypełniona obiektów, ale właściwości obiektów są puste

na przycisk-Click I POST niektóre dane do serwera. Mój kontroler działania wygląda następująco:

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 
} 

Jeżeli MyViewModel wygląda następująco:

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

I AJAX-Call jest follwing:

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

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

co już próbowałem do:

  • Zmieniono dataType do 'json'
  • używane: tradycyjna: true
  • próbowali myEntries var = JSON.stringify (...);
  • tried var myEntries = {wpisy: [JSON.stringify ({...}), JSON.stringify ({...})]};
  • takie same, jak powyżej, ale z jQuery.param (..., true);
  • Używanie IEnumerable lub MyViewModel [] zamiast listy.
  • dowolna kombinacja powyższych

Co robię źle tutaj?

Dziękuję bardzo, bardzo z góry za pomoc!

EDIT

My (Razor) Widok nie jest interesujące w tej chwili, ponieważ nie ma nic wspólnego z niczym. NIE używam żadnej z metod HTML.TextBoxFor (lub podobnych) do wypełnienia zmiennej myEntries. Jest on faktycznie wypełniany dynamicznie (ponieważ jest wiele warunków). Ze względu na pytanie (i moje własne testy) zakodowałem zmienną. :)

+0

można dodawać swój kod (Razor) widzenia? –

+0

Mój widok nie zawiera w sobie nic interesującego. Rozjaśniłem to w moim pytaniu. Zobacz EDIT-Sekcja – Shion

+0

Mam odpowiedź! Będę publikować tak szybko, jak tylko będę mógł (muszę poczekać 8 godzin ...) – Shion

Odpowiedz

12

Z twojej odpowiedzi i wykorzystania JSON.stringify metoda działa dla mnie

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

Wydaje się, że zapomniałem powiedzieć, że użyłem także JSON.stringify. Dziękuję za wskazanie tego. – Shion

+0

Dzięki, miałem ten sam problem z zapełnianiem mojej listy, ale wszystkie jej właściwości były puste. Używałem $ .Post (..), który moim zdaniem byłby po prostu otoką $ .ajax (type: 'POST', ...), ale musi być pewna różnica, ponieważ użycie przykładu $ .ajax powyżej działa świetnie . –

+0

Po prostu chcę podkreślić, że konfiguracja contentType do "application/json" ma kluczowe znaczenie. W moim przypadku po prostu nie działało bez tego! –

5

Dostałem odpowiedź!

jQuery może być mylące czasami.

dataType jest parametrem, który określa, co chcesz odzyskać z serwera. contentType to paremeter, który określa, co WYŚLIJ na serwer.

więc z powyższego przykładu to działa, jeśli dodać:

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

w wywołaniu AJAX.

1

Tylko pogratulować odpowiedź, w jaki sposób utworzyć listę, która będzie post Powrót do sterownika. Dzieje się tak dlatego, że nie musisz owijać tablicy nazwą listy.Wygląda to paskudnie i nie można nim zarządzać za pomocą wbudowanych funkcji. Ten przykład jest tutaj, aby pokazać, jak odesłać JSON, który MVC zrozumie i zinterpretuje jako Listę. (Ale nawet jeśli Array jest zawijany nadal działa, ale jest to zawartość statyczna i trudne do zarządzania)

W tym przykładzie użyto sortowalnej wtyczki jQuery. Chcę opublikować cały model listy z nowymi indeksami zamówień w celu zapisania w bazie danych.

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

} 

A mój kontroler MVC jest tak proste, jak ...

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

     return Content(""); 
    } 
+0

To zadziałało dla mnie. I tylko po to, aby powtórzyć, nie zapominaj o tym typie aplikacji/json! – K0D4

Powiązane problemy