Вопрос по c#, .net, asp.net-web-api – FromBody не привязывает строковый параметр

40

У меня есть проблема, похожая наПроблема привязки параметров веб-API ASP.NET MVC 4 RC, но я пытаюсь решить эту проблему с помощью атрибута [FromBody].

Fiddler сообщает о следующем запросе (исключая ненужные биты, такие как строка User Agent)

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

Мое действие контроллера

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

Я мог бы обернуть параметр в сложный тип, но это похоже на хак, чтобы исправить проблему. Или я мог бы поместить запрос в URI, но он не соответствует шаблону остальной части API. Можно ли сделать это таким образом? Если так, то где моя ошибка?

В заголовке написано POST, а в вопросе - PUT. Просто немного вводит в заблуждение. vbullinger
Связанный вопрос для Asp.Net Corestackoverflow.com/questions/31952002/… Michael Freidgeim

Ваш Ответ

2   ответа
21

Если вы используете AngularJS вместо jQuery, вы можете выбрать следующую альтернативу, поскольку AngularJS использует тип содержимогоapplication/json по умолчанию.

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'

Обратите внимание, что значение заключено в строковые кавычки (одинарные или двойные).

В угловом вы можете получить упаковку цитаты с помощьюangular.toJson кодировать вашу полезную нагрузку.
@Stony спасибо, это отличный совет
44

изменить ваш запрос на

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

обратите внимание на отсутствие «запроса»

невозможно, вам нужно использовать сложный тип. У Майка Сталла есть отличный блог, который я рекомендую всем, кто интересуется привязкой модели Web API.blogs.msdn.com/b/jmstall/archive/2012/04/16/…
Ты серьезно??? Это по замыслу? Совсем не интуитивно.
Спасибо за ссылку. Я также обнаружил, что вы можете анализировать содержимое самостоятельно, используяRequest.Content.ReadAsStringAsync().Result, если вы не хотите создавать модель.
конечно, вы все еще используете [FromUri] для передачи нескольких параметров простого типа
Есть идеи, как извлечь несколько строк из тела?

Похожие вопросы