C# 使用Delta实现补丁<;T>;使用JSON格式化程序
我已经安装了OData库,但只是为了获得对Delta的访问权,从而使修补程序可用于WebAPI。这是一种工作方式,但不适用于decimal和int等类型。我理解这是由于JSON格式化程序,而不是具体的Delta,但是否有一种变通方法或修复方法(或变通方法)可以应用于此以使其工作 我知道Delta是用来与OData(和格式化程序)一起工作的,但是如果没有像Delta那样的东西,那么在允许部分更新资源并且不限制可以传递的字段的情况下,使用不带Delta的补丁将很难实现 还有其他选择吗 相关问题-具有相同问题,整数/小数等。不更新C# 使用Delta实现补丁<;T>;使用JSON格式化程序,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我已经安装了OData库,但只是为了获得对Delta的访问权,从而使修补程序可用于WebAPI。这是一种工作方式,但不适用于decimal和int等类型。我理解这是由于JSON格式化程序,而不是具体的Delta,但是否有一种变通方法或修复方法(或变通方法)可以应用于此以使其工作 我知道Delta是用来与OData(和格式化程序)一起工作的,但是如果没有像Delta那样的东西,那么在允许部分更新资源并且不限制可以传递的字段的情况下,使用不带Delta的补丁将很难实现 还有其他选择吗 相关问题-具有
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;
}
更新以包含一些上下文代码
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;
}
身体
返回200,但未更新任何内容。但更重要的是,值为0:
我可以保留字符串,只是没有其他类型。由于注释有点失控,我开始回答这个问题 我试过你的代码,发现了一些奇怪的事情: 首先,在Patch方法上不使用override。如果没有这一点,请求甚至不应该到达,因为它无法解决 其次,假设您的“Value”字段是decimal类型,我不能像您那样发送decimal。即,在JSON中,值仅为101.00。我在自己的应用程序中也注意到了这一点,我的解决方案是将其作为字符串发送,并将其封装在引号(“Value”:“101.00”)中。它仍然以这种方式解析为十进制,我猜对于double和float也是如此 最后,为了真正用尽所有选项,您可以在补丁方法的顶部包含这行代码吗?
如果(!ModelState.IsValid)
{
抛出新的HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest,ModelState));
}
这样,您就得到了一个正确的请求响应,并给出了错误的响应
尽管如此,包括以上所有内容,我仍然可以修补非字符串。VisualStudio已经开始唠叨我的第一点,如果你不重写它提到的隐藏方法。我希望其中一点能解决你的问题。如果没有,我将更新我的答案,希望有更多的解决方案
还有其他选择吗
是的,对于Asp.Net core,请使用JsonPatchDocument
(使用Microsoft.AspNetCore.JsonPatch)
您使用的是什么版本的OData软件包?我可以成功地用5.0 beta 2(已确认)和4.0.30506(回忆,非常确定)修补整数。5.0 beta 2。。。。我可以修补,但似乎只有字符串、int、decimal等没有修补。我使用的是JSON格式化程序,你使用的是相同的吗?事实上,我是。如果在PATCH方法中检查ModelState的有效性,会发生什么?如果你尝试修补非字符串,它会被拒绝吗?嗨,Kazu,没有任何东西会被拒绝,这只是一个非字符串值没有被保留在增量中的情况,这是非常奇怪的,也就是说,当你检查非字符串的值是否为空时,你传递了它们,但在增量中。确实非常奇怪。实际上,您可以检查Delta这一事实意味着ModelState是有效的(否则补丁将为null)。我猜作为最后的手段,你可以发布所有相关的代码?也许是方法和模型?那样的话,也许我可以试着复制这个bug。
{
"Value":101.00
}