2012-06-24 19 views
8

AJAX GọiKhông MediaTypeFormatter có sẵn để đọc một đối tượng kiểu '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); 
     } 
    } 
}); 

Sent dữ liệu (json)/Request Payload

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

Đáp ứng Lỗi

Không có MediaTypeFormatter nào có sẵn để đọc một đối tượng thuộc loại 'InventoryItem' từ nội dung với loại phương tiện '' undefined ''."

Routed POST phương pháp

public HttpResponseMessage PostItem(InventoryItem item) 

Tất cả các thuộc tính trong chuỗi JSON có mặt trong mô hình InventoryItem.

A similar question liên quan đến các loại phức tạp đề xuất nâng cấp từ Beta lên RC để sửa mô hình thay đổi ràng buộc mà tôi đã thực hiện.

Nếu câu hỏi không rõ ràng, làm cách nào để khắc phục lỗi này? Nếu tôi thêm thuộc tính [FromUri] vào phương thức POST được định tuyến, thì cuộc gọi AJAX được định tuyến đúng cách, nhưng với một số trống rỗng InventoryItem. Nếu bạn cần bất kỳ thông tin nào khác, vui lòng cho tôi biết.

Trả lời

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

nên là:

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

Thông báo việc sử dụng ; thay vì , đó là tách chính xác giữa các kiểu nội dung và charset. Ngoài ra nếu bạn làm theo công ước RESTful tiêu chuẩn hành động điều khiển của bạn nên được gọi là Post và không PostItem như bạn đã chỉ ra:

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

Vâng, tôi đã làm theo [hướng dẫn] (http://www.asp.net/web- api/raw-content/tutorials/tạo-một-web-api-đó-hỗ trợ-crud-hoạt động), và hành động 'POST' của họ là' PostProduct'. Tuy nhiên, dấu chấm phẩy đã sửa chữa nó! Cảm ơn nhiều. – Josh

+0

Đó không phải là quy ước chuẩn được sử dụng bởi các lộ trình ASP.NET MVC 4 RC khi bạn tạo một dự án mới. Chúng sử dụng 'api/{controller}/{id}'. Như bạn có thể thấy tên hành động không phải là một phần của url, có nghĩa là hành động chính xác được chọn dựa trên động từ HTTP được sử dụng để thực hiện yêu cầu. Nhưng dù sao, điều này không liên quan đến vấn đề của bạn. Vấn đề của bạn bắt nguồn từ việc truyền giá trị sai cho tiêu đề HTTP loại nội dung. –

+0

Vì vậy, bạn thường không nên thêm bất kỳ thứ gì vào tên hành động ngoài tên yêu cầu của họ? Chẳng hạn như 'Post' hoặc' Delete' trái với 'PostItem' hoặc' DeleteItem'? – Josh

Các vấn đề liên quan