Marvin.JsonPatch无法识别jQuery PATCH请求

时间:2017-07-05 14:35:47

标签: jquery ajax asp.net-web-api json-patch

我正在尝试向Web API方法发送AJAX PATCH请求,并使Marvin.JsonPatch识别修补的对象。

到目前为止,我发送到服务器的所有内容都导致收到空请求。

Web API控制器方法如下所示:

public IHttpActionResult Update(ElementType elementType,
                                long elementId,
                                [FromBody] JsonPatchDocument<TranslationMatchDiscounts> matchDiscountsPatch)

那个TranslationMatchDiscounts对象非常简单:

public class TranslationMatchDiscounts
{
    public double ContextMatches { get; set; }


    public long ElementId { get; set; }


    public Enumerations.ElementType ElementType { get; set; }


    public double ExactMatches { get; set; }


    public double PerfectMatches { get; set; }


    public double Repetitions { get; set; }
}

我的jQuery AJAX请求就像这样:

$.ajax({
    //contentType: "application/json",
    data: { "Repetitions": 0.15 },
    //data: JSON.stringify({ "Repetitions": 0.15 }),
    dataType: "json",
    //processData: false,
    method: "PATCH",
    url: // my URL
});

注释掉的属性显示了我尝试过的一些内容。

控制器确实被击中,这不是问题,并且正在发送“Repetitions”属性,但服务器端JsonPatchDocument<TranslationMatchDiscounts>参数是......

  • null如果我将contentType财产留在原地
  • 没有针对所有其他尝试的属性/更新

使用jQuery的.ajax()发送PATCH请求的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

我的错。我的印象是PATCH允许我们发布一个只有更改属性的对象, ......

{
    "Repetitions": 0.15
}

没有。 PATCH需要的是 JSON patch document 。根据RTF:

  

JSON补丁文档是一个代表一个的JSON [RFC4627]文档   对象数组。

所以我的例子应该是

var patchDoc = [ { "op": "replace", "path": "/Repetitions", "value": 0.15 } ];

$.ajax({
    contentType: "application/json",
    data: JSON.stringify(patchDoc),
    dataType: "json",
    method: "PATCH",
    url: // my URL
});