4

我已经安装了 OData 库,但只是为了访问 Delta 以使 PATCH 可用于 WebAPI。它有点工作,但不适用于十进制和整数等类型。我知道这是由于 JSON 格式化程序,而不是特别是 Delta,但是否有解决方法或修复(或解决方法)可以应用于此以使其正常工作。

我知道 Delta 可以与 OData(和格式化程序)一起使用,但是当您允许资源的部分更新并且不限制可以传递的字段时,如果没有 Delta 之类的东西,使用没有 Delta 的 PATCH 就很难实现.

那里有替代方案吗?

相关问题 - 有同样的问题,int/decimal 等不要更新

PATCH 动作中的 Delta<T> 不跟踪原始类型

更新以包含一些上下文代码

POST/PATCH/PUT 类型将被简化为特定的 DTO,以便我可以减少对象的噪音,但现在我直接使用我的模型对象,因为我只是想让它工作。

补丁路线

    public HttpResponseMessage Patch(int id, Delta<Measurement> measurement)
    {
        var resp = new HttpResponseMessage(HttpStatusCode.OK);

        var dbMeasurement = (from n in _repo.Include("SurveyItem")
                      where n.Id == id
                      select n).SingleOrDefault();

        measurement.Patch(dbMeasurement);
        _uow.Commit();

        var measurementRep = dbMeasurement.ToRepresentation<Measurement, MeasurementRepresentation>();
        resp.Content = new ObjectContent<MeasurementRepresentation>(measurementRep, new JsonHalMediaTypeFormatter());

        return resp;
    }

提琴手发布选项

标头

User-Agent: Fiddler
Host: localhost:1996
Content-Length: 25
Content-Type: application/json

身体

{
     "Value":101.00
}

返回 200 但没有更新。但更能说明问题的是以下内容,值为 0:

三角洲

我可以坚持字符串,只是没有其他类型。

4

2 回答 2

2

由于评论有点失控,我开始回答这个问题。

我已经尝试了您的代码,并且看到了一些奇怪的事情:

首先,您不要在 Patch 方法上使用覆盖。没有这个,请求甚至不应该到达,因为它无法解决。

其次,假设您的“值”字段是小数类型,我不能像您一样发送小数。即在一个只有 101.00 值的 JSON 中。这也是我在自己的应用程序中注意到的,我的解决方案是将其作为字符串发送,并将其封装在引号中(“Value”:“101.00”)。它仍然以这种方式解析为小数,我猜双精度数和浮点数也是如此。

最后,为了真正穷尽所有选项,您能否将这行代码包含在您的补丁方法的顶部?

if (!ModelState.IsValid)
{
    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
}

这样,您将获得正确的 400 BadRequest 响应,其中包含错误的响应。

尽管如此,包括以上所有内容,我仍然可以修补非字符串。如果你不重写它提到隐藏方法的方法,Visual Studio 已经开始唠叨我的第一点。我希望这些要点之一可以解决您的问题。如果没有,我会用更多的解决方案更新我的答案。

于 2013-08-22T14:58:20.583 回答
0

那里有替代方案吗?

是的,使用 Asp.Net 核心JsonPatchDocument(使用 Microsoft.AspNetCore.JsonPatch)

这是如何使用它

于 2017-04-28T02:35:16.540 回答