我已经安装了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:
我可以坚持字符串,而不是其他类型。
答案 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)