【问题标题】:How to post complex object with a child collection in WebAPI如何在 WebAPI 中使用子集合发布复杂对象
【发布时间】:2020-02-04 22:07:26
【问题描述】:

我试图在我的控制器中发布一个对象,但它是空的。该对象是一种复杂类型,并且怀疑它是我得到异常的原因。

public class CertificateRequest
{
     public string Name {get;set;}
     public string RequestNumber {get;set;}

     public List<TradeUnit> TradeUnits {get;set;}
}
public class TradeUnit
{
     public string TradeUnitNumber {get;set;}
}

控制器:

[HttpPost]
public IHttpActionResult Post(CertificateRequest req)
{
     ........
}

当我检查 Swagger 时,它所期望的对象似乎是完全不同的。

<CertificateRequest>
   <Name>Some Name</Name>
   <RequestNumber>Req001</RequestNumber>
   <TradeUnits>
       <TradeUnitNumber>TUN0005</TradeUnitNumber>
   </TradeUnits>
</CertificateRequest>

当我想要发布多个 TradeUnit 并且我的结构将采用以下格式时,就会出现问题,我该如何实现。

<CertificateRequest>
   <Name>Some Name</Name>
   <RequestNumber>Req001</RequestNumber>
   <TradeUnits>
       <TradeUnit>
            <TradeUnitNumber>TUN0001</TradeUnitNumber>
       </TradeUnit>
       <TradeUnit>
            <TradeUnitNumber>TUN0002</TradeUnitNumber>
       </TradeUnit>       
       <TradeUnit>
            <TradeUnitNumber>TUN0003</TradeUnitNumber>
       </TradeUnit>
   </TradeUnits>
</CertificateRequest>

我怎样才能做到这一点?

【问题讨论】:

  • 当序列化一个数组/列表时,网络库会自动生成两个标签,如 。要只获取一个标签,您需要放置一个 XmlElement : [XmlElement] public List TradeUnits { get;set;}
  • 它似乎确实有效。要获得这个提议的结构,我似乎需要为集合创建一个包装器,即在 CertificateRequest 类上有一个复杂的属性,称为 public TradeUnits TradeUnits {get;set;} 并且在该类内部有一个集合。当然必须有一种更清洁的方法来做到这一点。
  • 这个链接对你有帮助stackoverflow.com/questions/44690905/…

标签: c# asp.net-web-api serialization asp.net-web-api2 xml-serialization


【解决方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication135
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            XmlWriter writer = XmlWriter.Create(FILENAME, settings);

            CertificateRequest request = new CertificateRequest();
            XmlSerializer serializer = new XmlSerializer(typeof(CertificateRequest));
            serializer.Serialize(writer, request);
        }
    }
    public class CertificateRequest
    {
        public string Name { get; set; }
        public string RequestNumber { get; set; }

        [XmlArray("TradeUnits")]
        [XmlArrayItem("TradeUnit")]
        public List<TradeUnit> tradeUnits { get; set; }

        public CertificateRequest()
        {
            Name = "Some Name";
            RequestNumber = "Req001";

            tradeUnits = new List<TradeUnit>() {
                new TradeUnit() { TradeUnitNumber = "TUN0001"},
                new TradeUnit() { TradeUnitNumber = "TUN0002"},
                new TradeUnit() { TradeUnitNumber = "TUN0003"}
            };
        }
    }
    public class TradeUnit
    {
        public string TradeUnitNumber { get; set; }
    }

}

使用以下将消除标签

        [XmlElement("TradeUnit")]
        public List<TradeUnit> tradeUnits { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2011-01-26
    • 2011-11-28
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    相关资源
    最近更新 更多