ASP. NET Изменение поведения привязки базовой модели Web API. - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть простой контроллер с пользовательским типом модели Заголовок - без конструктора и параметров без параметров c setter .

Я попробовал следующий код в asp. net mvc ядро ​​2.2 и 3.1.

Класс модели:

public class Heading
{
    public string Title { get; }
    public Heading(string title)
    {
        Title = title;
    }
}

Контроллер API:

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
    [HttpPost]
    public void Post([FromBody] Heading value)
    {
    }
}

С. net ядро ​​2.2, переплет работает отлично. Но для ядра 3.1 выдается ошибка

System.NotSupportedException: десериализация ссылочных типов без конструктора без параметров не поддерживается. Введите 'WebApplication3.Controllers.Heading' в System.Text. Json .ThrowHelper.ThrowNotSupportedException_DeserializeCreateObjectDelegateIsNull (введите invalidType)

Это изменение в поведении? Можно ли все еще достичь?

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

In ASP. NET Core 2.2 , работает только из-за Newtonsoft.Json. В ASP. NET Core Version> = 3.0 она была заменена на System.Text.Json. Здесь больше о Newtonsoft.Json, новом по умолчанию ASP. NET Core JSON Сериализатор.

Если вы хотите вернуться к предыдущему использованию по умолчанию Newtonsoft.Json, выполните следующие действия:

Сначала установите пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet. Затем в ConfigureServices() добавьте вызов к AddNewtonsoftJson() следующим образом:

public void ConfigureServices(IServiceCollection services)
{
     ...
     services.AddControllers()
          .AddNewtonsoftJson()
     ...
 }

Для более подробной информации: ASP. NET Core 3.0 - New JSON сериализация

0 голосов
/ 26 февраля 2020

Из документов :

Сложные типы

A complex type must have a public default constructor and public writable properties to bind. When model binding occurs, the class is instantiated using the public default constructor.

Вам потребуется добавить конструктор без параметров для привязки, чтобы использовать эта модель.

Такое поведение могло бы сработать для вас раньше (2.2 и ранее), если вы использовали Newtonsoft Json, который мог разрешать модели конструкторов без параметров. Начиная с версии 3.0. NET Core использует более новый сериализатор System.Text. Json по умолчанию .

...