Класс со свойствами коллекции не связывается должным образом при публикации от XML до ASP. Net Core 3.1 Web API - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь опубликовать свои данные как XML в моем asp. net core 3.1 web api. Однако свойства коллекции не привязываются в моей модели.

Вот мой класс,

public class Test
{
    public int Usrno { get; set; }
    public string PCname { get; set; }

    public List<Best> Best { get; set; }
}

public class Best
{
    public string Hello { get; set; }

    public Worst[] Worst { get; set; }
}

public class Worst
{
    public int Ko { get; set; }

    public Win[] Win { get; set; }
}

public class Win
{
    public string Kiss { get; set; }
}

Вот моя POST конечная точка,

[HttpPost]
[Consumes("application/xml")]
[Produces("application/xml")]
public IActionResult Create([FromBody]Test data)
{
    return Created("", data);
}

Здесь мой XML ввод,

<?xml version="1.0" encoding="UTF-8"?>
<Test>
    <Usrno>0</Usrno>
    <PCname>string</PCname>
    <Best>
        <Hello>string</Hello>
        <Worst>
            <Ko>0</Ko>
            <Win>
                <Kiss>string</Kiss>
            </Win>
        </Worst>
    </Best>
</Test>

Вот экранная печать метода POST в API,

enter image description here

Вот мои ConfigureServices в Startup.cs,

services
    .AddControllers()
    .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; })
    .AddXmlSerializerFormatters()
    .AddXmlDataContractSerializerFormatters();

Я не мог понять, что мне не хватает. Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Массив или список в xml сериализации ожидают два тега, такие как «Имена» и «Имя». У вас есть только один тег, поэтому вам нужно добавить атрибут XmlElement. Эта проблема возникает в нескольких местах в ваших классах. Я исправил все проблемы. Смотрите классы ниже

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);

            XmlSerializer serializer = new XmlSerializer(typeof(Test));
            Test test = (Test)serializer.Deserialize(reader);
        }
    }
    public class Test
    {
        public int Usrno { get; set; }
        public string PCname { get; set; }

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

    public class Best
    {
        public string Hello { get; set; }

        [XmlElement("Worst")]
        public Worst[] Worst { get; set; }
    }

    public class Worst
    {
        public int Ko { get; set; }

        [XmlElement("Win")]
        public Win[] Win { get; set; }
    }

    public class Win
    {
        public string Kiss { get; set; }
    }
}
1 голос
/ 25 марта 2020

Попробуйте использовать элемент XmlElementAttribute для Best.

Атрибут XmlElement указывает, что поле или свойство publi c представляет элемент XML, когда XmlSerializer сериализует или десериализует объект, который его содержит. .

C#

public class Test
{
    public int Usrno { get; set; }
    public string PCname { get; set; }

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

MVC XmlSerializerInputFormatter вызывает XmlSerializer для десериализации тела запроса, и формирователь использует этот атрибут для отметки XML элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...