2012-07-17 16 views
40

Ho un problema simile a ASP.NET MVC 4 RC Web API Parameter Binding Issue, ma sto cercando di risolverlo utilizzando l'attributo [FromBody].FromBody not binding string parameter

Fiddler riporta la seguente richiesta (esclusi i bit irrilevanti come User Agent String)

PUT http://localhost:82/api/account/shoppinglistitems HTTP/1.1 
Host: localhost:82 
Connection: keep-alive 
Content-Length: 11 
Origin: http://localhost:3000 
Content-Type: application/x-www-form-urlencoded 
Accept: application/json, text/javascript, */*; q=0.01 

query=apple 

La mia azione del controller è

[HttpPut] 
public ShoppingListItemWebModel CreateShoppingListItem([FromBody]string query) { 
    // query is null 
} 

ho potuto avvolgere il parametro in un tipo complesso, ma che sembra un trucco per risolvere il problema. Oppure potrei inserire la query nell'URI, ma ciò non si adatta allo schema del resto dell'API. È possibile farlo in questo modo? Se è così, dov'è il mio errore?

+1

Il titolo dice POST, ma la domanda dice PUT. Solo un po 'fuorviante. – vbullinger

+0

Domanda correlata per Asp.Net Core https://stackoverflow.com/questions/31952002/asp-net-core-mvc-how-to-get-raw-json-bound-to-a-string-without-a- digitare –

risposta

44

cambiare la vostra richiesta di essere

PUT http://localhost:82/api/account/shoppinglistitems HTTP/1.1 
Host: localhost:82 
Connection: keep-alive 
Content-Length: 11 
Origin: http://localhost:3000 
Content-Type: application/x-www-form-urlencoded 
Accept: application/json, text/javascript, */*; q=0.01 

=apple 

avviso la mancanza di "query"

+2

Qualche idea su come estrarre più stringhe dal corpo? –

+5

non possibile, dovresti usare un tipo complesso. Mike Stall ha un grande blog sul quale lo consiglio a chiunque sia interessato al binding del modello di API Web http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter- binding.aspx –

+0

ovviamente usi ancora [FromUri] per passare più parametri di tipo semplice –

21

Se stai usando AngularJS invece di jQuery si potrebbe desiderare di optare per la seguente alternativa, dal momento che utilizza contenuti AngularJS digitare application/json per impostazione predefinita.

PUT http://localhost:82/api/account/shoppinglistitems HTTP/1.1 
Host: localhost:82 
Connection: keep-alive 
Content-Length: 7 
Origin: http://localhost:3000 
Content-Type: application/json 
Accept: application/json, text/javascript, */*; q=0.01 

'apple' 

Si noti che il valore è racchiuso tra virgolette (singole o doppie).

+10

In angolare, è possibile ottenere il ritorno preventivo utilizzando [angular.toJson] (https://docs.angularjs.org/api/ng/function/angular.toJson) per codificare il payload. – Richard

+0

@Stony, grazie, è un ottimo consiglio –

Problemi correlati