2012-06-24 21 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)/請求負載

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

響應錯誤

沒有MediaTypeFormatter可用於讀取類型的對象'InventoryItem' 從與媒體類型內容 '' 未定義 ''「。

路由POST方法

public HttpResponseMessage PostItem(InventoryItem item) 

在JSON字符串的所有屬性都存在於InventoryItem模型。

A similar question關於複雜類型建議從Beta升級到RC來修復模型綁定更改,我已經完成。

如果問題不明顯,我該如何糾正這個錯誤?如果我將[FromUri]屬性添加到路由POST方法,則AJAX調用會正確路由,但是會有空的InventoryItem。如果您需要其他信息,請告訴我。

回答

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

應該是:

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

通知之;代替,使用其內容類型和字符集之間的正確分離器。此外,如果你遵循標準的REST風格的約定,你給你的控制器動作應該叫Post,而不是PostItem

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

好,我是繼[教程](http://www.asp.net/web- api/raw-content/tutorials/creating-a-web-api-that-supports-crud-operations),他們的'POST'動作是'PostProduct'。但是,分號確實修復了它!非常感謝你。 – Josh

+0

這不是在創建新項目時ASP.NET MVC 4 RC路由使用的標準約定。他們使用'api/{controller}/{id}'。如您所見,動作名稱不是url的一部分,這意味着基於用於執行請求的HTTP動詞選擇了正確的動作。但無論如何,這與你的問題無關。您的問題源自爲Content-Type HTTP標頭傳遞錯誤的值。 –

+0

因此,除了請求類型之外,您通常不應該添加任何操作名稱?比如'Post'或'Delete',而不是'PostItem'或'DeleteItem'? – Josh

相關問題