2012-07-17 10 views
40

Tengo un problema similar al ASP.NET MVC 4 RC Web API Parameter Binding Issue, pero estoy tratando de resolverlo utilizando el atributo [FromBody].FromBody no vinculante cadena parámetro

violinista informa la siguiente petición (excluidos los bits irrelevantes como agente de usuario de cuerdas)

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 

Mi acción del controlador es

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

pude envolver el parámetro en un tipo complejo, pero que parece un truco para solucionar el problema. O podría poner la consulta en el URI, pero eso no se ajusta al patrón del resto de la API. ¿Es posible hacerlo de esta manera? Si es así, ¿dónde está mi error?

+1

El título dice POST, pero la pregunta dice PUT. Solo un poco engañoso. – vbullinger

+0

Pregunta relacionada para Asp.Net Core https://stackoverflow.com/questions/31952002/asp-net-core-mvc-how-to-get-raw-json-bound-to-a-string-without-a- tipo –

Respuesta

44

cambiar su solicitud para ser

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 

aviso de la falta de "consulta"

+2

¿Alguna idea de cómo extraer múltiples cadenas del cuerpo? –

+5

no es posible, tendría que usar el tipo complejo. Mike Stall tiene un gran blog sobre el que se lo recomiendo a cualquiera que esté interesado en el enlace de modelo de la API web http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter- binding.aspx –

+0

por supuesto, todavía usa [FromUri] para pasar múltiples parámetros de tipo simple –

21

Si está utilizando AngularJS en lugar de jQuery es posible que desee optar por las siguientes alternativas, ya que AngularJS utiliza contenidos tipo application/json de forma predeterminada.

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' 

Observe que el valor se envuelve en comillas de cadena (ya sean simples o dobles).

+10

En angular, puede obtener el ajuste de la cita utilizando [angular.toJson] (https://docs.angularjs.org/api/ng/function/angular.toJson) para codificar su carga útil. – Richard

+0

@Stony gracias, eso es un gran consejo –