【问题标题】:Posting Collection to OData Controller not returning nested collection property to client将集合发布到 OData 控制器未将嵌套集合属性返回给客户端
【发布时间】:2017-07-20 07:34:28
【问题描述】:

我定义了以下模型类:

public class LinePostModel
    {
        [Key]
        public int OrderId { get; set; }
        public IList<OrderLine> OrderLines { get; set; }
    }

我的 OData 控制器上的这个方法:

public async Task<IHttpActionResult> Post(LinePostModel model)
{
  //validae model and its OrderLines collection and save to repo.

  return Created(model);
}

服务器正确接收模型对象,并处理每个查找。我的问题是返回给客户端的 RESPONSE 只包含原始 OrderId 属性,不包含集合属性 OrderLines。

如何解决这个问题,以便将整个复杂对象返回给客户端?

编辑:添加示例 json:

这是客户发布的内容:

{
      orderId:4,
      orderLines: [
        {
            lineType: "S",
            orderQty: 10,
            priceCode: "D",
            stockCode: "62.C6W026A.050",
            warehouse: "GS",
            orderId:4
        },
        {
            lineType: "S",
            orderQty: 20,
            priceCode: "D",
            stockCode: "62.C6W026A.060",
            warehouse: "GS",
            orderId:4
        }
      ]
}

这是客户端从服务器接收到的内容:

{
  "@odata.context": "http://localhost:4095/$metadata#OrderLines/$entity",
  "orderId": 4
}

我已尝试将服务器更改为返回Ok(model) 而不是Created(model),但这并没有什么区别。

控制器方法中return Created(model) 行上的断点表明,此时模型对象肯定包含 OrderLines 的集合。

【问题讨论】:

  • OrderLines 在客户端包含什么?是空的吗?
  • 当客户端调用 Post 方法时,模型在服务器端被正确填充和反序列化。问题是当服务器向客户端返回 Created 响应时,该响应对象根本不包含 OrderLines 属性。
  • 返回结果时我还没用 Created。我使用return Ok(model); 来返回内容。你可以试试看。
  • Ok(model) 和 Created(model) 都试过了,但都无济于事。
  • 您可以在检索数据的地方发布客户端脚本

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


【解决方案1】:

没有足够的信息继续,但如果您使用实体框架保存到存储库,请记住在检索保存的记录时添加 .Include() 以返回子记录。

【讨论】:

  • 感谢 Andre 的输入,但不,这不是问题...返回 Created(model) 上的断点表明模型肯定填充了 OrderLines 属性。
【解决方案2】:

我认为你应该试试这个答案,看看是否有帮助。 https://stackoverflow.com/a/16472870/1233465

您可以尝试在请求中添加接受标头,看看是否有帮助。请分享您的结果和发现。

【讨论】:

    【解决方案3】:

    如果您不需要父类,您可以只返回 List

    return Created(model.orderLines);
    

    当其他人提到他们返回的字符串是整个复杂对象的 JSON 序列化时,我意识到了这一点。如果他们可以返回字符串,我可以返回 List

    【讨论】:

      【解决方案4】:

      OrderLine 也是一个实体,还是一个复杂的属性?

      您需要确保您的 WebApiConfig.cs 中定义的 EDM 模型具有正确映射的上述关系。对于初学者,您应该在运行时检查 /$metadata。

      如果 EDM 模型没有正确的关系,那么 ODATA 管道将去除额外的信息。

      【讨论】:

        【解决方案5】:

        我有同样的问题。对我来说,OrderLine 被定义为实体类型。同一类型不能同时是实体和复杂类型,因为复杂类型没有“Id”属性。确保 OrderLine 未设置为 EntityType。如果这不起作用,请尝试将其明确设置为“ComplexType”。

        【讨论】:

          【解决方案6】:

          是的,我遇到了同样的问题,请试试这个:

          http://localhost:4095/odata/LinePostModel?$expand=OrderLines
          

          【讨论】:

          • Oliver 在这里提供更多细节。可能是 ODATA 文档的链接,显示了 expand 参数的作用。
          • 我在所有来自微软的 http 方法 ODATA 中都读到了一些关于它的内容,我没有手头的文档。但是在您的 POST 请求中,您可以指定您希望如何成为响应。在我写的示例中,我说我想要响应中的嵌套对象“LinePostModel”。我猜你有时会看到扩展查询选项,如果不是docs.microsoft.com/en-us/odata/concepts/queryoptions-overview
          猜你喜欢
          • 2015-10-13
          • 1970-01-01
          • 1970-01-01
          • 2017-08-23
          • 2019-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-03
          相关资源
          最近更新 更多