【问题标题】:AJAX PUT call using odata returning server error使用 odata 返回服务器错误的 AJAX PUT 调用
【发布时间】:2016-05-13 04:21:13
【问题描述】:

我正在尝试使用 ODATA 对我的 Web API 进行基本的 AJAX PUT 调用。这真的不应该那么难,而且我已经让 POST 和 GET 工作了,但是 PUT 是有问题的。使用 Fiddler,它告诉我:“属性 'Id' 是对象的关键信息的一部分,不能修改。”这是我在项目中的内容(与我放入 fiddler 的内容相同):

$.ajax({
    url: url,
    type: "PUT",
    contentType: "application/json",
    dataType: "json",
    data: JSON.stringify({
        "Outcome": callResult,
        "CallTimes": timeTried,

    }),
    success: function (data) {
        alert("Saved to database!");
    },
    error: function (xhr, status, err) {
        alert("Failed to save: " + xhr + "\n" + status + "\n" + err);
    }
});

【问题讨论】:

  • 您控制 OData 服务的实施吗?如果是这样,您的 PUT 控制器方法是什么样的?
  • 这是从 .net api 生成的默认代码。太长了,不能在这里发帖...
  • 你用什么工具来生成代码?
  • Visual Studio 2015 - 我使用了 ASP.NET 4.5.2 Web API 模板

标签: jquery ajax asp.net-web-api odata


【解决方案1】:

您没有将Id 属性作为data(有效负载)的一部分发送。我猜这会导致服务器端的Id 被反序列化为null0,这很可能与url 中实体键的值不匹配。因此,服务器上的代码认为您正在尝试修改Id 的值。 (请参阅Create an OData v4 Endpoint Using ASP.NET Web API 2.2 中的“更新实体”,以获取将实体键与请求负载中的Id 属性进行比较的Put 方法示例。)

尝试将Id 属性添加到data,如下所示:

data: JSON.stringify({
    "Id": key_value
    "Outcome": callResult,
    "CallTimes": timeTried,
})

其中key_value 是您的url 中用作实体键的值。

【讨论】:

  • 是的,这是有道理的。通常,我认为 odata URL 查询会使用 url 的 id 部分(如localhost:11064/odata/ContactInfoes(4))来解决这个问题,但该错误似乎已被另一个错误所取代。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多