使用带有JSON格式化程序的Delta <t>实现PATCH </t>

时间:2013-08-16 12:04:21

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

我已经安装了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对象,因为我只是试着让它工作。

PATCH路线

    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 OPTIONS

接头

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

{
     "Value":101.00
}

返回200,但没有更新任何内容。但更有说服力的是以下内容,值为0:

Delta

我可以坚持字符串,而不是其他类型。

2 个答案:

答案 0 :(得分:2)

由于评论有点失控,我正在开始这个答案。

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

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

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

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

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

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

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

答案 1 :(得分:0)

  

那里有替代品吗?

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

Here is how to use it