1

我有以下 ASP.net 核心控制器:

[ApiVersion(ApiConstants.Versions.V1)]
[Route(RouteConstants.ApiControllerPrefix + "/tenants/" + RouteConstants.TenantIdRegex + "/entities")]
public class EntityController
{
    [HttpPatch]
    [SwaggerOperation(OperationId = nameof(PatchEntity))]
    [Route("{controlId:guid}", Name = nameof(PatchEntity))]
    [SwaggerResponse(StatusCodes.Status204NoContent, "Result of the patch")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [Consumes(MediaTypes.Application.JsonPatch)]
    public async Task<IActionResult> PatchEntity(string tenantId, Guid entityId, JsonPatchDocument<EntityModel> entityPatches)
    {
        //
    }
}

控制器允许我修补现有实体。这是模型:

[JsonObject(MemberSerialization.OptIn)]
public class EntityModel
{
    [JsonProperty(PropertyName = "isAuthorized")]
    public bool IsAuthorized { get; set; }
}

对于我的测试,我正在使用postman在实体上发送补丁。PATCH我选择了针对此 URL的动词:

http://localhost:5012/api/v1/tenants/tenant-id/entities/01111111-0D1C-44D6-ABC4-2C9961F94905

在标题中,我添加了Content-Type条目并将其设置为application/json-patch+json.

这是请求的正文:

[
    { "op": "replace", "path": "/isAuthorized", "value": "false" }
]

我启动了应用程序并在控制器上设置了一个断点。使用正确的租户 ID 和实体 ID 命中断点。但是,entityPatches没有任何操作:

entityPatches.Operations.Count = 0

因此,无法更新IsAuthorized目标的属性。EntityModel我希望该Operations属性具有一个replace操作,如 HTTP 请求中所定义。

问题

为什么类的Operations属性JsonPatchDocument缺少 HTTP 请求正文中定义的补丁操作?

4

1 回答 1

1

您缺少参数FromBody上的属性entityPatches,例如:

public async Task<IActionResult> PatchEntity(
    string tenantId, 
    Guid entityId, 
    [FromBody] JsonPatchDocument<EntityModel> entityPatches)
  //^^^^^^^^^^ Add this
{
    //snip
}
于 2018-10-11T13:17:03.007 回答