ASP.NET Web API получает dto из тела с типом интерфейса - PullRequest
0 голосов
/ 24 октября 2019

Я хочу создать [HTTPPOST] метод контроллера. Как вы можете видеть ниже, у меня есть класс с двумя свойствами типа IBaseClass. Это связано с тем, что эти свойства могут иметь тип MyClassA или MyClassB.

. У меня dtos выглядит так:

public MyDtoToGet {
    public int MyId {get;set;}
    public IBaseClass base1 {get;set;}
    public IBaseClass base2 {get;set;}
}

public interface IBaseClass {
    public int Id {get;set;}
}

public class MyClassA : IBaseClass {
    public int Id {get;set;}
    public string PropertyA {get;set;}
}

public class MyClassB : IBaseClass {
    public int Id {get;set;}
    public int PropertyB {get;set;}
}

И мой контроллер выглядит так:

[HttpPost]
public ActionResult Post([FromBody]MyDtoToGet myDtoToGet)
{
    // Problem here -> myDtoToGet is null!
}

Я предполагаю, что существует проблема десериализации свойств IBaseClass для MyDtoToGet в JSON. A [HTTPGET] отлично работает. Поскольку я никогда не делал ничего подобного, я понятия не имел, что я делаю неправильно ...

Заранее спасибо! :)

Ответы [ 4 ]

0 голосов
/ 04 ноября 2019

Я решил это, приняв JObject вместо MyDtoToGet из тела JSON. Затем я вручную преобразовал тип интерфейсов в правильный тип. В конце я создал новый объект и добавил преобразованные объекты.

В любом случае, спасибо.

0 голосов
/ 01 ноября 2019

Если вы хотите получить данные в виде MyDtoToGet класса. JSON должен быть в следующем формате. Причина, по которой вы получили null, связана с передачей неверного формата json.

{
    "MyId": 1,
    "base1": {
        "Id": 2,
        "PropertyA": "any string"
    },
    "base2": {
        "Id": 3,
        "PropertyA": "any string"
    }
}
0 голосов
/ 01 ноября 2019

Убедитесь, что не забыли установить заголовок 'content-type: application / json' для вашего запроса, и чтобы формат ваших данных json соответствовал вашему DTO.

Лучше всего попробовать с простым DTO для запуска.

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

Вам не нужно делать ваш класс DTO очень сложным. Поскольку вы хотите создать свой DTO со свойствами в других классах, сделайте это следующим образом. Вы собираетесь использовать DTO для чтения данных от пользователя (Клиентские технологии / Почтальон). Вам не нужно поле id.

public MyDtoToGet {
public string PropertyA {get;set;} 
public string PropertyA {get;set;} 
}

Дополнительно: протестируйте его с почтальоном, Req Type должен опубликовать и тело типа JSON и отправить следующие данные

{
 "propertyA": "GreatWord",
 "propertyB": "ItIsEasy"
}

, а затем вы увидите, что данные получены.

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