c# – 使用带JSON Formatter的Delta实现PATCH

我已经安装了OData库,但只是为了获得访问Delta以使PATCH可用于WebAPI.它有点工作,但不适用于decimal和int等类型.我理解这是由于
JSON格式化程序,而不是特定的Delta,但是有一个解决方法或修复(或解决方法)可以应用于此以使其工作.

我知道Delta是与OData(和格式化程序)一起工作的,但是如果你允许部分更新资源并且不限制可以传递的字段,那么在没有Delta的情况下使用PAT的Delta会变得很难实现.

那里有替代品吗?

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

Delta<T> in PATCH actions not tracking primitive types

更新包含一些背景代码

POST / PATCH / PUT类型将简化为特定的DTO,这样我就可以减少对象的噪音,但是现在我直接使用我的Model对象,因为我只是试着让它工作.

补丁路线

    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;
    }

FIDDLER POST选项

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

身体

{
     "Value":101.00
}

返回200但没有更新.但更有说服力的是以下,值为0:

我可以坚持字符串,没有其他类型.

最佳答案 由于评论有点失控,我开始回答这个问题.

我已经尝试过你的代码了,我看到了一些奇怪的东西:

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

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

最后,为了真正耗尽所有选项,您可以在补丁方法的顶部包含这行代码吗?

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

通过这种方式,您可以获得正确的400 BadRequest响应以及错误的响应.

尽管如此,包括以上所有内容,我仍然可以修补非字符串. Visual Studio已经开始唠叨我的第一点,如果你没有覆盖它提到隐藏方法的方法.我希望其中一点可以解决你的问题.如果没有,我会希望更多的解决方案更新我的答案.

点赞