Ricevo quello che considero un problema di binding strano nell'API Web RC ASP.NET MVC 4. Ho un metodo destinato ad accettare richieste di posta dal client. Il problema è che nessuno dei parametri è vincolante quando viene chiamato il metodo post, arrivo al punto di interruzione sulla riga di lancio e il nome, entrambi i messaggi di posta elettronica sono nulli. Se cambio il tipo della richiesta in GET in JavaScript, la funzione Get di seguito viene chiamata con i parametri associati.ASP.NET MVC 4 RC API Web Legame dei problemi Numero
Perché i parametri non riescono a eseguire il binding per il metodo Post e come posso risolvere questo problema?
send: function(evt) {
evt.preventDefault();
$.ajax({
url: '/api/person',
data: this.model.toJSON(),
type: "POST",
dataType: "json",
success: function(data) {
console.log("Success");
},
error: function(data) {
console.log("Error");
}
});
}
Quello che segue è l'azione del controller:
public void Get(string name, string email) {
throw new NotImplementedException();
}
public void Post(string name, string email) {
throw new NotImplementedException();
}
Note:
- sto usando tutti i valori predefiniti per ASP.NET MVC 4 RC Web API (in modo che il deserializzatore dovrebbe essere Json.NET)
- La scheda di rete di Chrome sul debugger JS mostra correttamente i parametri nei dati del modulo nel post.
Il parametro get non è nullo, infatti non esiste nemmeno. Potrei non essere stato chiaro ma è solo lì per illustrare che la funzionalità funziona su GET e non su POST. – Cody
Okay - beh, va bene allora :). In breve, tuttavia, se si vincolano più parametri dal corpo della richiesta, in pratica la cosa più semplice da fare è scrivere un tipo di modello semplice come ho mostrato. –
Grazie per il link all'articolo di Mike Stall, è stato molto istruttivo su cosa sta succedendo. Avevo appena ipotizzato che le API Web usassero esattamente la stessa strategia di binding di MVC. Creare una classe personalizzata per ricevere i parametri ha funzionato come un incantesimo, non sono un fan di questa soluzione, ma non riesco a capire perché, quindi probabilmente sono solo testardo. :) In ogni caso è la soluzione che userò. Grazie!:) – Cody