【问题标题】:Posting Complex Objects through JSON to MVC Web API通过 JSON 将复杂对象发布到 MVC Web API
【发布时间】:2019-01-21 14:38:11
【问题描述】:

我知道这是可能的,因为我一直使用其他 API 来做这件事。我遇到的问题是,当我发布以下 JSON 时,我的相关子对象 ICollection 为空。对于我做错了什么,任何帮助将不胜感激。这是我的对象:

public class PartsExpressOrder
{
    [Key]
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public DateTime? OrderDate { get; set; }
    public double SubTotal { get; set; }
    public double Freight { get; set; }
    public double Taxes { get; set; }
    public double Total { get; set; }
    public string OrderStatus { get; set; }
    public string CompanyName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public string ShipToName { get; set; }
    public string ShipToAddress { get; set; }
    public string ShipToCity { get; set; }
    public string ShipToState { get; set; }
    public string ShipToZip { get; set; }
    public string ShipToPhone { get; set; }
    public string BillToName { get; set; }
    public string BillToAddress { get; set; }
    public string BillToCity { get; set; }
    public string BillToState { get; set; }
    public string BillToZip { get; set; }

    public virtual ICollection<PartsExpressOrderItem> PartsExpressOrderItems { get; set; }
}

public class PartsExpressOrderItem
{
    [Key]
    public int OrderItemId { get; set; }
    public int OrderId { get; set; }
    public int MasterPartId { get; set; }
    public string Description { get; set; }
    public int Quantity { get; set; }
    public double Price { get; set; }
    public double Total { get; set; }
}

这是我通过 JSON 发布的内容:

{
  "CustomerId": 1,
  "OrderDate": "2018-07-01",
  "SubTotal": 65.68,
  "Freight": 15.00,
  "Taxes": 5.00,
  "Total": 85.68,
  "OrderStatus": "Sent",
  "CompanyName": "Test Company A",
  "FirstName": "Bob",
  "LastName": "Dobalina",
  "Phone": "5035551212",
  "Email": "bdobalina@testcompanya.com",
  "ShipToName": "Bob Dobalina",
  "ShipToAddress": "5512 Test Company A Blvd. Suite 503",
  "ShipToCity": "Seattle",
  "ShipToState": "WA",
  "ShipToZip": "98103",
  "ShipToPhone": "5035551212",
  "BillToName": null,
  "BillToAddress": null,
  "BillToCity": null,
  "BillToState": null,
  "BillToZip": null,
"PartsExpressOrderItem":
[{
  "MasterPartId": 1,
  "Description": "Widget",
  "Quantity": 2,
  "Price": 20.34,
  "Total": 40.68
},
{
  "MasterPartId": 2,
  "Description": "Sprocket",
  "Quantity": 5,
  "Price": 5.00,
  "Total": 25.00
}]
}

最后是我的控制器:

 // POST: api/PartsExpressOrders
    [ResponseType(typeof(PartsExpressOrder))]
    public IHttpActionResult PostPartsExpressOrder(PartsExpressOrder partsExpressOrder)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.PartsExpressOrder.Add(partsExpressOrder);
        db.SaveChanges();

        foreach(var item in partsExpressOrder.PartsExpressOrderItems)
        {
            item.OrderId = partsExpressOrder.OrderId;
            db.PartsExpressOrderItem.Add(item);
            db.SaveChanges();
        }

        return CreatedAtRoute("DefaultApi", new { id = partsExpressOrder.OrderId }, partsExpressOrder);
    }

【问题讨论】:

  • 您的 json 无效,您不能多次拥有相同的属性 ("PartsExpressOrderItem")。
  • @Liam 很好抓到... 哦!我已经进行了相应的修改,不幸的是它仍然是空的。
  • @AnthonyGriggs 看到我的回答。您需要将PartsExpressOrderItem 更新为PartsExpressOrderItems。 json键需要匹配c#属性的名称

标签: c# json asp.net-mvc api


【解决方案1】:

您的 ICollection&lt;PartsExpressOrderItem&gt; PartsExpressOrderItems 的 json 表示形式似乎无效。它应该类似于:

"PartsExpressOrderItems" : [
    { 
        "MasterPartId": 2,
        "Description": "Sprocket",
        "Quantity": 5,
         "Price": 5.00,
         "Total": 25.00
    },
    { 
        "MasterPartId": 3,
        "Description": "Something",
        "Quantity": 10,
         "Price": 12.00,
         "Total": 47.00
    }
]

json 表示和 C# 之间的名称需要匹配,除非您实现了自定义序列化方案(即:需要使用 PartsExpressOrderItems 作为键而不是 PartsExpressOrderItem)。此外,您正在查看的 C# 属性是 ICollection,因此您需要使用 json 数组而不是使用相同的键放入多个对象

【讨论】:

  • 感谢您的快速响应和帮助。仅供参考,我已经用另一个建议切换到 IEnumerable,但又切换回 ICollection
猜你喜欢
  • 2013-02-25
  • 2014-09-02
  • 1970-01-01
  • 2020-12-03
  • 2012-12-19
  • 2018-02-20
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
相关资源
最近更新 更多