Как разместить сложный объект с дочерней коллекцией в WebAPI - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь разместить объект в моем контроллере, но он приходит в ноль. Объект является сложным типом, и я подозреваю, что это причина, по которой я получаю исключение.

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>

Проблема возникает, когда у меня есть несколько TradeUnits, которые я хотел бы опубликовать, и моя структура должна быть в следующем формате, как мне этого добиться.

<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>

Как мне этого добиться?

1 Ответ

0 голосов
/ 08 октября 2019

Попробуйте следующее:

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; }
...