2013-02-20 13 views
7

używam jQuery 1.9.1 i MVC 4.De-szeregowania obiektu w wynikach działania MVC4 w wartości null

Mam następujący skrypt:

$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: JSON.stringify({ devices: [{ Id: 123, Name: "something", MapName: "map" },{ Id: 321, Name: "a name", MapName: "another map" }] }), 
    dataType: 'json', 
    contentType: 'application/json' 
} 

i następujący C# w moim HomeController:

[HttpPost] 
public string doSomething(Device[ ] devices) 
{ 
    //stuff consuming that array 
} 

klasę urządzeń jest określona w następujący sposób:

[Serializable] 
public class Device 
{ 
    public long Id; 
    public string Name; 
    public string MapName; 
} 

Według debuggera, tablica urządzeń jest dwuelementową tablicą, w której wszystkie właściwości każdego elementu Device są puste.

Według chrom, dane stanowisko wygląda następująco:

{ 
    "devices": [ 
     { 
      "Id": 123, 
      "Name": "something", 
      "MapName": "map" 
     }, 
     { 
      "Id": 321, 
      "Name": "a name", 
      "MapName": "another map" 
     } 
    ] 
} 

Co tu jest nie tak, że robi MVC przysięgam w górę iw dół, że obiekty te są nieważne, ale wciąż daje mi tablicę odpowiednie długości im?

Próbowałem wysyłać tablicy bezpośrednio, bez wywoływania JSON.stringify na nim. Próbowałem umieszczać tablicę wewnątrz obiektu jako właściwość o nazwie "urządzenia", ponownie bez oznaczania jej. Próbowałem umieścić tablicę wewnątrz obiektu jako właściwość o nazwie "devices", a jedynie stringifying samej tablicy.

Wszystko to powoduje złe zachowanie jednej lub drugiej formy. Albo chrome nie publikuje odpowiednich danych, albo MVC nie deklasuje go.

Przeszukałem internet i nie mogę znaleźć przykładów, dla których to powinno zostać zerwane.

Edycja 21.02.2013 13:12 UTC-5:

Próbowałem to również bez użycia JSON i po prostu pozwolić jQuery zakładać go jako danych formularzy. Oto kod na to:

var postData = { devices: [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }] }; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: postData 
}); 

A C# jest nadal takie same jak powyżej.

Zachowanie jest jednak takie samo jak w przypadku JSON. MVC widzi tablicę 2 elementów, ale wszystkie wartości obiektów w tej tablicy są domyślne (0 dla liczby całkowitej i zero dla łańcuchów).

+0

To, co jest warte, nie działa również, gdy nie publikuję go jako JSON. Nie jestem żonaty z tym przy użyciu JSON, ale potrzebuję MVC do deserializacji danych pocztowych/jakoś /. – dodexahedron

Odpowiedz

3

Oto, co w końcu udało się ...

pierwsze, zmieniłem javascript, aby obiekt z właściwość o nazwie „urządzenia”, które zawiera stringified tablicy:

var postData = { devices: JSON.stringify([{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }]) }; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    dataType: 'json', 
    data: postData 
    } 

Potem zrobiłem działanie kontrolera wziąć jeden ciąg o nazwie „urządzenia” i de -serialized go ręcznie za pomocą Json.NET:

[HttpPost] 
public string MakeMmLinks(string devices) 
{ 
    List<Device> devicesList = JsonConvert.DeserializeObject<List<Device>>(devices); 
    ... 
} 

to działało w porządku, ale to, co denerwuje mnie to, że przedmiot de-serializacji ma być czymś, MVC obsługuje natywnie.

Jeśli ktoś ma wgląd w to, co się tutaj wydarzyło lub co zrobiłem źle, chciałbym to usłyszeć.

+0

Brak wglądów, ale dzięki, spędziłem wieki drapiąc się po tym samym problemie. –

0

Publikujesz obiekt obiektu z właściwością zawierającą tablicę 2 urządzeń. Jeśli chcesz po prostu opublikować tablicę urządzeń, spróbuj wykonać następujące czynności.

var devices = [{ Id: 123, Name: "something", MapName: "map" }, { Id: 321, Name: "a name", MapName: "another map" }]; 
$.ajax({ 
    url: '/Home/doSomething', 
    type: 'POST', 
    data: JSON.stringify(devices), 
    dataType: 'json', 
    contentType: 'application/json' 
}); 
+0

To było tak, jak pierwotnie to robiłem, a to powoduje to samo zachowanie. MVC odbiera tablicę, wie, ile elementów w niej jest, i ustawia wszystkie właściwości elementów na wartość null. – dodexahedron

+2

Dlaczego przesyłasz ciąg do kontrolera? Sam obiekt Post js. –

+0

Bezpośrednie wysyłanie tablicy powoduje również złe zachowanie. Chrome wysyła "undefined = & undefined =" jako dane postu, gdy bezpośrednio publikuję tablicę. – dodexahedron

1

W takich przypadkach znalazłem tradition: true jest bardzo ważne. Nie wiesz, czy potrzebujesz stringify

dataType: 'json', 
traditional: true 
Powiązane problemy