2012-06-24 3 views
8

AJAX вызоваНет MediaTypeFormatter доступен для чтения объект типа 'InventoryItem'

$.ajax({ 
    url: '/api/Inventory', 
    cache: false, 
    type: 'POST', 
    data: json, 
    contentType: 'application/json, charset=utf-8', 
    statusCode: { 
     201: function (data) { 
      console.log(data); 
      viewModel.items.push(data); 
     } 
    } 
}); 

Отправленные данные (json)/Запрос Payload

{"Id":0,"Upc":"3456789012","Quantity":"200","Category":"Vodka","TransactionType":"Audit","MetaData":"ABSOLUT 750ml"} 

Ошибка Ответ

Нет MediaTypeFormatter доступен для чтения объекта типа «InventoryItem» от содержания с типом носителя «» не определено «».»Метод

маршрутизацией ПОСТ

public HttpResponseMessage PostItem(InventoryItem item) 

Все свойства в строке JSON присутствуют в InventoryItem модели.

A similar question В отношении сложных типов предлагается модернизация с Beta на RC, чтобы исправить изменение привязки модели, которое я сделал.

Если вопрос не очевиден, как исправить эту ошибку? Если я добавлю атрибут [FromUri] к методу Routed POST, тогда вызов AJAX будет маршрутизирован правильно, но с пустым InventoryItem. Если вам нужна какая-либо другая информация, пожалуйста, дайте мне знать.

ответ

19
contentType: 'application/json, charset=utf-8', 

должно быть:

contentType: 'application/json; charset=utf-8', 

Обратите внимание на использование ; вместо ,, который является правильным разделитель между типом контента и кодировкой. Кроме того, если вы будете следовать стандартным RESTful конвенции, ваши действия контроллера следует назвать Post и не PostItem, как вы показали:

public HttpResponseMessage Post(InventoryItem item) 
{ 
    ... 
} 
+0

Ну, я после [учебник] (http://www.asp.net/web- api/raw-content/tutorials/create-a-web-api-that-support-crud-operations), а их действие «POST» было «PostProduct». Тем не менее, полуколока сделала это! Большое спасибо. – Josh

+0

Это не стандартное соглашение, используемое путями ASP.NET MVC 4 RC при создании нового проекта. Они используют 'api/{controller}/{id}'. Поскольку вы видите, что имя действия не является частью URL-адреса, это означает, что правильное действие выбрано базой на HTTP-глаголе, используемом для выполнения запроса. Но в любом случае это не связано с вашей проблемой. Ваша проблема связана с передачей неправильного значения для HTTP-заголовка Content-Type. –

+0

Итак, вы обычно не должны добавлять ничего к имени действия, кроме своего типа запроса? Например, 'Post' или' Delete' в отличие от 'PostItem' или' DeleteItem'? – Josh

Смежные вопросы