ODataV4补丁总是获得空值

问题描述 投票:1回答:1

我试图从客户端获取值到ODataV4补丁方法。但它没有成功。它始终从客户端获取空值。以下是我的代码,

[HttpPatch]
    [EnableQuery]
    public IHttpActionResult Patch(int key, Delta<EmployeeDetail> patch)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var entity = _db.EmployeeDetails.Find(key);
        patch.Patch(entity);
        _db.SaveChanges();
        return Updated(entity);
    }

enter image description here

c# asp.net-mvc model-view-controller odata-v4
1个回答
0
投票

规格:OData Version 4.0. Part 1: Protocol Plus Errata 03 8.2.8.7偏好返回=表示和返回=最小 在OData中,return = representation或return = minimal被定义为与POST,PUT或PATCH数据修改请求一起使用,而不是用于流属性或Action Request。

如果Preference标头不存在,则在.Net实现中默认采用return=minimal,从而产生204 No Content响应。

您应该确保客户端请求在您期望响应数据的方案中具有PreferencePrefer标头,或者您可以修改您的修补程序处理程序以使用备用默认值:

[HttpPatch]
[EnableQuery]
public IHttpActionResult Patch(int key, Delta<EmployeeDetail> patch)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var entity = _db.EmployeeDetails.Find(key);
    patch.Patch(entity);
    _db.SaveChanges();


    // Return content by default
    // Disable this by sending in header { Prefer: "return=minimal" }
    if (!this.Request.Headers.Any(k => k.Key.Equals("prefer", StringComparison.OrdinalIgnoreCase) || k.Key.Equals("preference", StringComparison.OrdinalIgnoreCase)))
        this.Request.Headers.Add("Prefer", "return=representation");

    return Updated(entity);
}

注意:对于此解决方案中的所有请求,Prefer标头尚未进行硬编码,只有那些未指定标头的请求,这样用户请求仍然可以在需要时操作响应。

Prefer的值在OData v3的早期版本中有所不同,在ODataLIb的v4的.Net实现的早期版本中,您会发现一些文档说明Prefer头需要值“content”或“return = content” ......这些解决方案不再有效。

© www.soinside.com 2019 - 2024. All rights reserved.