Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Delta实现补丁<;T>;使用JSON格式化程序_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

C# 使用Delta实现补丁<;T>;使用JSON格式化程序

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的补丁将很难实现 还有其他选择吗 相关问题-具有

我已经安装了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
}