2013-05-14 11 views
31

Ho un messaggio ajax in fase di costruzione in questo modo:Ajax post per regolatore ASP.net MVC - proprietà degli oggetti sono nulli

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

E un controller MVC:

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

} 

MyClass è solo una semplice rappresentazione dei dati:

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

Quando il JavaScript rende la richiesta pOST, l'azione di controllo fare in effetti ricevono 2 voci, tuttavia le proprietà (id, nome) in questi elementi sono nulle.

Controllo della richiesta violinista, il corpo si presenta così:

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

Ho perso qualcosa?

+2

Solo una supposizione, forse è perché le proprietà sono in minuscolo in javascript e maiuscolo in C#. – Tallmaris

+3

No, non è quello. Il serializzatore JSON non fa distinzione tra maiuscole e minuscole. –

+0

Un altro scenario in cui le proprietà sono nulle - http://stackoverflow.com/questions/18124405/json-object-properties-are-coming-as-null – Lijo

risposta

59

Ho perso qualcosa?

Sì, dare un'occhiata allo following article per capire il formato di filo corretto che il raccoglitore modello predefinito si aspetta per le raccolte di rilegatura. In altre parole, per questo lavoro, invece di:

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

vostro carico utile dovrebbe dovuto essere così:

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

Purtroppo con jQuery può essere molto frustrante per raggiungere questo payload. Per questo motivo mi sento di raccomandare di utilizzare un carico utile JSON, se si desidera inviare oggetti complessi/matrici al server con AJAX:

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

cose da notare:

  • data: JSON.stringify({ items: myData }) invece di data: { items: myData }
  • Aggiunto contentType: 'application/json'
  • deciso di eliminare dataType: 'json'

Ora il vostro carico utile si presenta così:

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

Works - thanks! – Alex

+0

Ci sono volute due ore del mio tempo per cercare di capire cosa c'era di sbagliato nel mio codice. Grazie amico! – Sanchitos

+4

Questo è probabilmente ovvio, ma si noti anche che '{get; impostato; } 'Anche sul lato del tuo server verrà creato o rotto questo! Questo è tutto ciò che mi mancava, ma questo mi ha indirizzato nella giusta direzione. Grazie! – lhan

-4

è possibile utilizzare questo codice per risolvere il problema:

$.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) 
{ 

} 
Problemi correlati