【问题标题】:ASP.NET WebAPI OData Delta object fields is null in PATCH requestASP.NET WebAPI OData Delta 对象字段在 PATCH 请求中为空
【发布时间】:2016-04-05 18:37:16
【问题描述】:

我在OData 支持下创建了ASP.NET WebAPI

Project 类有一个名为 ProjectType 的字段,其中声明了可为空的整数类型:

public class Project
{
        public string Id { get; set; }
        public string Name { get; set; }
        public int? ProjectType { get; set; }
}

我的 WebAPI 控制器:

public class LocalModelsController : ODataController
{
  public IHttpActionResult Patch([FromODataUri] string key, Delta<Project> patch)
  {   
        var projectUpdated = patch.GetEntity();
        var projectType = projectUpdated.ProjectType;

        //projectType is null here
  }
}

当我从客户端向 WebAPI 发送 PATCH http 请求(使用 BSON 内容类型格式)时,Project 对象具有正确的 Id 和 Name 值,但 ProjectType 始终为 null。

但是当我将ProjectType字段类型从int?更改为double?时,它工作正常:

public double? ProjectType { get; set; }

是 ODATA 的限制还是我遗漏了什么?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api asp.net-web-api-odata


    【解决方案1】:

    我已经解决了。这只是因为我使用BSON 格式通过HTTP 请求传输对象。如果我改用JSON,效果会很好。不过不确定BSON 格式有什么问题。

    【讨论】:

    • 你能显示你的客户端ajax请求代码吗?我正在使用自动脚手架 OData v 4 web api 控制器...我正在使用 JSON.. 但是.. Delta 参数始终为空
    【解决方案2】:

    您可能只需要将 projectUpdated 转换为正确的类型。

    例如

    var projectUpdated = patch.GetEntity();
    
    Project p = projectUpdated as Project;
    
    if (p != null)
    {
           var projectType = p.ProjectType;
    }
    

    【讨论】:

    • path.GetEntity() 已经返回 Project 类型,为什么还要转换它?
    • 因为您将其存储为 var (var projectUpdate = ....)。您可以先将其存储为项目,也可以将其投射。
    • 我不明白。您是说您的代码不起作用还是我建议的解决方案?
    • 您的代码显然不能正常工作。我认为您需要先了解更多关于“var”关键字在 C# 中的工作原理^^
    • 抱歉,我注意到 if 循环中有错误。我应该使用p 而不是projectUpdated。已更新。
    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2015-03-12
    • 2014-09-17
    • 1970-01-01
    • 2013-11-26
    • 2014-04-05
    相关资源
    最近更新 更多