Asp. Net Веб-API 2: Как получить привязку данных для использования правильного типа данных в методе контроллера? - PullRequest
1 голос
/ 20 апреля 2020

В двух словах, у меня есть два класса и два производных класса. Производный класс имеет коллекцию, которая скрывает родительский класс. Несмотря на то, что метод Controller имеет родительский тип данных для параметра, Web API 2 создает производный тип данных для параметра и помещает Items, отправленный клиентом, в скрытую коллекцию Items.

Как мне правильно написать этот код для отправки данных, которые выглядят как производный класс, но получить к ним доступ как к типу данных родительского класса, или я неправильно использую ключевое слово new? Родительские классы представляют таблицы базы данных. Производные классы заполняют подтверждающие данные о товарах в корзине. Я думаю, я мог бы создать два разных метода Controller и перегрузить их, но мне все равно любопытно, как это сделать правильно.

У меня есть следующие классы:

ShoppingListVM {
    public int Id {get;set;}
    public ICollection<ShoppingListItemVM> Items {get;set;}
}
ShoppingListItemVM {
    public int Id {get;set;}
}

И производные классы:

ShoppingListExpandedVM : ShoppingListVM {
    new public ICollection<ShoppingListItemExpanded> Items {get;set;}
}
ShoppingListItemExpandedVM : ShoppingListItemVM {
    public string Name {get;set;}  // Additional fields beyond ShoppingListItemVM above
}

Метод Controller выглядит следующим образом, в частности получает тип данных ShoppingListVM.

public ShoppingListExpandedVM ShoppingListSave([FromBody] ShoppingListVM shoppingList) {
    var myShoppingList = ShoppingListVM.Map( shoppingList);
    _shoppingListService.Save( myShoppingList);
    _db.SaveChanges();
}

Я отправляю данные с полями ShoppingListExpandedVM с Items с полями ShoppingListItemExpandedVM. Параметр Controller ShoppingListVM shoppingList показывает данные правильно, за исключением вложенного Items, который является нулевым. Отладчик показывает два массива Items, в которых тип данных ShoppingListItemExpandedVM заполнен, а тип данных ShoppingListItemVM пуст.

...