2013-05-14 13 views
31

Mam ajax słupek budowany tak:Ajax stanowisko do kontrolera ASP.net MVC - Właściwości obiektu są nieważne

var myData = [ 
    { 
     id: "a", 
     name: "Name 1" 
    }, 
    { 
     id: "b", 
     name: "Name 2" 
    } 
]; 

$.ajax({ 
    type: 'POST', 
    url: '/myurl/myAction', 
    data: { items: myData }, 
    dataType: 'json', 
    error: function (err) { 
     alert("error - " + err); 
    } 
}); 

i kontroler MVC:

[HttpPost] 
public JsonResult MyAction(MyClass[] items) 
{ 

} 

MyClass jest po prostu prosta reprezentacja danych:

public class MyClass { 
    public string Name {get; set; } 
    public string Id {get; set; } 
} 

Kiedy javascript wysyła żądanie postu, działanie kontrolera nie es rzeczywiście otrzymują 2 przedmioty, jednak właściwości (id, nazwa) w tych pozycjach są zerowe.

Sprawdzanie wniosek w Skrzypek, ciało wygląda następująco:

Name     | Value 
items[0][Name]  | Name 1 
items[0][Id]   | a 
items[1][Name]  | Name 2 
items[1][Id]   | b 

Czy coś przeoczyłem?

+2

tylko domyślać, może dlatego, że właściwości te są małe litery w javascript i wielkimi literami w języku C#. – Tallmaris

+3

Nie, to nie to. Serializator JSON nie rozróżnia wielkości liter. –

+0

Kolejny scenariusz, w którym właściwości są zerowe - http://stackoverflow.com/questions/18124405/json-object-perties-are-coming-coming-as-null – Lijo

Odpowiedz

59

Czy coś przeoczyłem?

Tak, spójrz na following article, aby zrozumieć prawidłowy format drutu, który domyślny spoidek modelu oczekuje na wiążące kolekcje. Innymi słowy, za to do pracy, zamiast:

items[0][Name]  | Name 1 
items[0][Id]   | a 
items[1][Name]  | Name 2 
items[1][Id]   | b 

swoją ładowność powinna wyglądał następująco:

items[0].Name  | Name 1 
items[0].Id   | a 
items[1].Name  | Name 2 
items[1].Id   | b 

Niestety z jQuery może to być bardzo frustrujące, aby osiągnąć ten ładunek. Z tego powodu polecam skorzystanie ładunek JSON, jeśli chcesz wysłać złożonych obiektów/tablice z serwerem z AJAX:

$.ajax({ 
    type: 'POST', 
    url: '/myurl/myAction', 
    data: JSON.stringify({ items: myData }), 
    contentType: 'application/json', 
    error: function (err) { 
     alert("error - " + err); 
    } 
}); 

warte zauważyć:

  • data: JSON.stringify({ items: myData }) zamiast data: { items: myData }
  • Dodano contentType: 'application/json'
  • pozbyć dataType: 'json'

Teraz twój ładunek wygląda następująco:

{"items":[{"id":"a","name":"Name 1"},{"id":"b","name":"Name 2"}]} 
+0

Działa - dzięki! – Alex

+0

Zajęło mi to dwie godziny próbując dowiedzieć się, co jest nie tak z moim kodem. Dzięki stary! – Sanchitos

+4

Jest to prawdopodobnie oczywiste, ale zauważ, że '{get; zestaw; } 'po stronie twojego serwera właściwości również to utworzy lub rozwiąże! To wszystko, czego mi brakowało, ale to wskazało mi właściwy kierunek. Dzięki! – lhan

-4

można użyć tego kodu, aby rozwiązać ten problem:

$.ajax({ 
    url: '/myurl/myAction', 
    data: { '': items }, 
    method: "POST", 
    dataType: 'json', 
    success: function (xhr, status, response) { 
    }, 
    error: function (xhr, status, response) { 
    } 
}); 

[HttpPost] 
public JsonResult MyAction(IEnumerable<MyClass> items) 
{ 

} 
Powiązane problemy