我已经安装了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已经开始唠叨我的第一点,如果你没有覆盖它提到隐藏方法的方法.我希望其中一点可以解决你的问题.如果没有,我会希望更多的解决方案更新我的答案.