ODataV4修补程序始终获取空值

时间:2019-02-22 09:08:54

标签: c# asp.net-mvc model-view-controller odata-v4

我试图从客户端获取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

1 个答案:

答案 0 :(得分:0)

  

规格:OData Version 4.0. Part 1: Protocol Plus Errata 03
  8.2.8.7首选项return = representation和return = minimum
   在OData中,将return = representation或return = minimal定义为与POST,PUT或PATCH数据修改请求一起使用,而不是用于流属性或操作请求。

如果没有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标头并未针对所有请求进行硬编码,只有那些未指定标头的请求才被硬编码,这样,如果需要,用户请求仍然可以操纵响应。 / p>

Prefer的值在OData v3的早期版本中以及在ODataLIb中的v4的.Net实现的早期版本中是不同的,您会发现一些文档指出Prefer头需要一个“ content”值”或“ return = content” ...这些解决方案不再起作用。