ASP.NET Core не может получить объект из тела

Код:

[HttpPost("user/register")]
public IActionResult Register([FromBody] User user)
{
    if (user?.Name is null || user?.Password is null)
    {
        return BadRequest(new {message = "User is null and/or name and password are not provided"});
    }
    else
    {
         // Add to db
         return Json(user);
    }
}

Также класс пользователя:

public class User
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
    public string Role { get; set; }
}


По сути, он должен получить пользователя и добавить его в базу данных. Я попытался отправить этот json:

{ "Name": "Batman", "Password": "IronmanSucks"}

Приложение перехватило запрос, но пользовательский объект был нулевым. Я также пробовал с:

{ "user": { "Name": "Batman", "Password": "IronmanSucks"} }

Но, согласно этой документации, первый json должен был работать нормально.

Вот ссылка на пример http-запроса в почтальоне


Делает это связаны с заголовками или это ошибка в .NET Core 2.0?


person Mitko Rusev    schedule 16.08.2017    source источник
comment
Не могли бы вы добавить структуру вашего класса User?   -  person Matthieu Charbonnier    schedule 16.08.2017
comment
Если Json не полностью соответствует объекту User, объект будет нулевым. Поэтому важно включить класс в вопрос.   -  person Matthieu Charbonnier    schedule 16.08.2017
comment
Если атрибут FromBody не используется, происходит сбой с кодом 500.   -  person Mitko Rusev    schedule 16.08.2017
comment
@MitkoRusev При отладке в окне вывода будут показаны сведения о необработанных исключениях. Что он говорит, когда выбрасывает 500?   -  person Camilo Terevinto    schedule 16.08.2017
comment
@MitkoRusev Возможно, Guid (id) не принимает нулевое значение. Вы пытались установить значение в json от почтальона? (например, E796E7EB-EB5A-485C-A1A0-26C5F5F242C1). Или попробуйте изменить тип Guid на Guid?.   -  person Matthieu Charbonnier    schedule 16.08.2017
comment
@CamiloTerevinto Ты был прав. Если атрибут не используется, объект не попадает в действие, но проблема не в конструкторе без параметров. При добавлении такого работало как с атрибутом, так и без него. Он у меня есть, потому что мне нужна документация Swagger.   -  person Mitko Rusev    schedule 16.08.2017
comment
@MitkoRusev рад, что вы смогли увидеть настоящую ошибку. Обратите внимание, что почти никогда не требуется указывать [FromBody], если только вы не хотите строго разрешать привязку этого параметра только через тело. И окно вывода — ваш друг. Вы должны опубликовать ответ, чтобы он был зарегистрирован   -  person Camilo Terevinto    schedule 16.08.2017
comment
@CamiloTerevinto Итак, [FromBody] ограничивает только другие способы ввода   -  person Mitko Rusev    schedule 16.08.2017


Ответы (3)


Это может произойти только в том случае, если у типа нет конструктора без параметров, поэтому это можно просто исправить, добавив такой.

person Mitko Rusev    schedule 16.08.2017
comment
@MatthieuCharbonnier, вам нужен конструктор без параметров, неявный, если конструкторов нет вообще, или явный, если уже есть конструктор с параметрами. - person Camilo Terevinto; 16.08.2017

Я считаю, что Модель считается недействительной, поэтому она недействительна. Вам следует попробовать добавить атрибут [BindNever] в класс User для свойств Role и Guid, поскольку вы их не используете.

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

public class User
{
    public string Name { get; set; }
    public string Password { get; set; }
}

public class DataUser : User
{
    public Guid Id { get; set }
    public string Role { get; set; }
}
person bin    schedule 22.01.2018

Если вы используете MVC Core вместо MVC, убедитесь, что вы добавили Json Formatters (из Microsoft.AspNetCore.Mvc.Formatters .Json). В вашем Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddMvcCore()
        .AddJsonFormatters();
}

Это должно помочь [FromBody] десериализовать содержимое вашего сообщения.

person mircea    schedule 13.02.2018