【问题标题】:No MediaTypeFormatter is available to read an object of type 'InventoryItem'没有 MediaTypeFormatter 可用于读取“InventoryItem”类型的对象
【发布时间】:2012-06-24 19:55:05
【问题描述】:

AJAX 调用

$.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 模型中。

关于复杂类型的similar question建议从 Beta 升级到 RC 以修复模型绑定更改,我已经这样做了。

如果问题不明显,我该如何纠正这个错误?如果我将 [FromUri] 属性添加到 Routed POST 方法,则 AJAX 调用会正确路由,但 InventoryItem 为空。如果您需要任何其他信息,请告诉我。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api


    【解决方案1】:
    contentType: 'application/json, charset=utf-8',
    

    应该是:

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

    注意; 的用法,而不是,,这是内容类型和字符集之间的正确分隔符。此外,如果您遵循标准 RESTful 约定,您的控制器操作应称为 Post 而不是 PostItem,如您所示:

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

    【讨论】:

    • 嗯,我关注的是tutorial,他们的POST 操作是PostProduct。但是,分号确实解决了它!非常感谢。
    • 创建新项目时,这不是 ASP.NET MVC 4 RC 路由使用的标准约定。他们使用api/{controller}/{id}。如您所见,动作名称不是 url 的一部分,这意味着根据用于执行请求的 HTTP 动词选择正确的动作。但无论如何,这与你的问题无关。您的问题源于为 Content-Type HTTP 标头传递了错误的值。
    • 那么,除了请求类型之外,您通常不应该在操作名称中添加任何内容吗?例如PostDelete 而不是PostItemDeleteItem?
    • @Chase,准确地说。 HTTP 动词指示将在 RESTful 控制器上调用哪个操作。
    • 另外,由于这只是一个分号问题,我知道这个问题可能过于本地化,无法真正帮助任何人。我会接受你的回答,但我明白它是否被标记为删除。
    猜你喜欢
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2015-08-13
    • 2018-05-29
    • 2012-09-12
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多