【发布时间】:2013-08-16 12:04:21
【问题描述】:
我已经安装了 OData 库,但只是为了访问 Delta 以使 PATCH 可用于 WebAPI。它有点工作,但不适用于十进制和整数等类型。我知道这是由于 JSON 格式化程序,而不是特别是 Delta,但是否有一种解决方法或修复(或解决方法)可以应用于此以使其正常工作。
我知道 Delta 可以与 OData(和格式化程序)一起使用,但是如果没有 Delta 之类的东西,使用没有 Delta 的 PATCH 就很难实现,当您允许对资源进行部分更新并且不限制以下字段时可以通过。
还有其他选择吗?
相关问题 - 有同样的问题,int/decimal 等不要更新
Delta<T> in PATCH actions not tracking primitive types
更新为包含一些上下文代码
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;
}
FIDDLER 发布选项
标题
User-Agent: Fiddler
Host: localhost:1996
Content-Length: 25
Content-Type: application/json
身体
{
"Value":101.00
}
返回200,但没有更新。但更能说明问题的是,值为0:
我可以持久化字符串,只是没有其他类型。
【问题讨论】:
-
您使用的是什么版本的 OData 包?我可以成功地使用 5.0 beta 2(已确认)和 4.0.30506(回想起来,但很确定)修补整数。
-
5.0 Beta 2....我可以修补,但似乎只有字符串,int,decimal 等没有得到修补。我用的是 JSON 格式器,你用的是一样的吗?
-
其实我是。如果在 PATCH 方法中检查 ModelState 的有效性会发生什么?如果您尝试修补非字符串,它会被拒绝吗?
-
嗨,Kazu,没有任何东西被拒绝,这只是非字符串值没有保留在 Delta 中的情况,这很奇怪,即当您检查值时,您通过了它们但在 delta 中对于非字符串,它们为空。
-
确实很奇怪。您实际上可以检查 Delta 的事实意味着 ModelState 是有效的(否则补丁将只是空的)。我想作为最后的手段,您可以发布所有相关代码?也许是方法和模型?这样,也许我可以尝试重现该错误。
标签: c# asp.net asp.net-web-api