【问题标题】:Implementing PATCH with Delta<T> with JSON Formatter使用 JSON Formatter 使用 Delta<T> 实现 PATCH
【发布时间】: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


【解决方案1】:

由于评论有点失控,我开始回答这个问题。

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

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

其次,假设您的“值”字段是小数类型,我无法像您一样发送小数。 IE。在只有 101.00 值的 JSON 中。我在自己的应用程序中也注意到了这一点,我的解决方案是将其作为字符串发送,并将其封装在引号中(“Value”:“101.00”)。它仍然以这种方式解析为小数,我猜双精度数和浮点数也是如此。

最后,为了真正穷尽所有选项,你能把这行代码包含在你的补丁方法的顶部吗?

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

这样,您会得到正确的 400 BadRequest 响应,其中包含错误的响应。

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

【讨论】:

    【解决方案2】:

    还有其他选择吗?

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

    Here is how to use it

    【讨论】:

      猜你喜欢
      • 2013-11-27
      • 2022-09-29
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-31
      • 2023-03-20
      相关资源
      最近更新 更多