.Net привязка базовой модели JSON Post to Web API

Просто начал новый проект с использованием .NET Core. Добавлен мой контроллер веб-API и связанный метод. Используя Postman, я создал объект JSON и разместил его в своем методе контроллера. Имейте в виду, что объект JSON точно соответствует параметру Object в методе контроллера.

В режиме отладки я вижу объект, он не нулевой, свойства есть, ОДНАКО значения по умолчанию устанавливаются по умолчанию для их типов представителей, 0 для int и т.д.

Я никогда не видел такого поведения раньше... поэтому я взял точно такой же код и объект и реплицировал его в проекте MVC с контроллером Web API 2, и он отлично работает.

Чего мне не хватает, могу ли я не POST JSON и привязку модели в .NET Core?

Читая эту статью, кажется, я не могу, если я не отправлю как форму POST или как строку запроса, которая, кстати, работает нормально.

https://lbadri.wordpress.com/2014/11/23/web-api-model-binding-in-asp-net-mvc-6-asp-net-5/

JSON:

{
   "id": "4",
   "userId": "3"
   "dateOfTest": "7/13/2017"
}

Метод:

[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test(Class1 data)
{
    return Ok();
}

Ответ 1

Вы должны отметить свой параметр как исходящий из тела атрибутом FromBody следующим образом:

[HttpPost]
[Route("test1")]
[AllowAnonymous]
public IActionResult Test([FromBody] Class1 data)
{
    return Ok();
}

Вам нужно убедиться, что вы используете приложение /json в качестве своего типа контента из Postman:

Postman application/json

В результате чего:

json POST action

Удостоверьтесь, что ваши разработчики недвижимости также являются общедоступными:

public class Person
{
    public String Name;
    public Int32 Age;
}

Ответ 2

Я несколько часов боролся с этой проблемой, и ни один из существующих решений не работал для меня, но оказалось, что у меня не было открытого конструктора без параметров для класса входящего экземпляра. В этом случае Class1 имел только защищенные конструкторы, и параметр всегда был нулевым, несмотря ни на что. Надеюсь, это поможет кому-то.

Ответ 3

set;} для каждого атрибута в моем классе как так:

    public class LogString{
        public string val {get; set;}
        public string data {get; set;}
    }

В остальном было так же:

        [HttpPost]
        public void Post([FromBody] LogString message)
        {      
            Console.WriteLine(message.val);
        }

После добавления это начало работать.