Передача модели в ViewModel с использованием Automapper

#c# #asp.net #automapper

#c# #asp.net #automapper

Вопрос:

Я работаю над ASP.NET основной проект. Я хочу сопоставить модель с viewmodel с помощью Automapper, но есть проблема, которая описана ниже, это MyRepository

  public class MyRepository
 {
     public async Task<IEnumerable<Cars>> GetAllCarsAsync()
    {
        return await _RepositoryContext.Set<Cars>().ToListAsync();
    }
 }
  

И это MyController

  public class MyController: Controller
 {
    [HttpGET]
    public async Task<IActionResult> Create()
      {
          var car = await _MyRepository.GetAllCarTypesAsync();
          var model = _mapper.Map<IEnumerable<CarsVM>>(car);
          return View(model);
      }
 }
  

И, наконец, это мое мнение

 @model  DataLayers.Models.ViewModels.CarsVM

<form " asp-controller="MyController" asp-action="Create">
  <label class="label" asp-for="Carname"></label>
  <input class="input" type="text" asp-for="Carname">
  <select>
     <option> A carType </option>
     <option>A carType </option>
  </select>
</from>
  

Проблема в моем контроллере. var car возвращает IEnumerable, а затем мы сопоставляем результат с CarsVM. когда я передаю модель для просмотра, он ожидает, что CarsVM не имеет номера CarsVM. как я могу их скрыть? И если теперь их можно преобразовать, что мне делать? как я могу передать свои данные для просмотра?

Комментарии:

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

2. @ErikPhilips Итак, каково решение? что мне делать?? должен ли я создать новый репозиторий??

3. Понятия не имею. Вы не объяснили, что вы пытаетесь сделать, просто что не работает. Как выглядит ваше представление? Вам нужны все машины или 1 машина?

4. @ErikPhilips На самом деле это представление является представлением создания. В этом представлении администраторы могут добавлять car. Администраторы также могут выбрать CarType из выпадающего списка, который получает свои данные из базы данных. И если вам понадобится дополнительная информация, просто скажите мне, какая часть необходима, я добавлю ее.

5. Что такое CarsVM ?

Ответ №1:

Я бы предложил обновить строку automapper для преобразования в список вместо интерфейса IEnumerable, чтобы вы могли убедиться, что модель представления материализована в контроллере. Это очевидно, глядя на код репозитория, но не в том случае, если вы видите, что репозиторий возвращает только IEnumerable.

Основные изменения, приведенные ниже, направлены на то, чтобы AutoMapper отображался в список объектов модели представления и чтобы представление получало модель, составленную из списка этих объектов модели представления. Я предположил, что объект CarsVM является экземпляром viewmodel одного объекта Cars.

Репозиторий

 public class MyRepository
{
    public async Task<List<Cars>> GetAllCarsAsync()
    {
        return await _RepositoryContext.Set<Cars>().ToListAsync();
    }
}
  

Контроллер

 public class MyController: Controller
{
    [HttpGET]
    public async Task<IActionResult> Create()
    {
        var car = await _MyRepository.GetAllCarTypesAsync();
        var model = _mapper.Map<List<CarsVM>>(car);
        return View(model);
    }
}
  

Вид

 @model List<DataLayers.Models.ViewModels.CarsVM>
<form asp-controller="MyController" asp-action="Create">
    <label class="label" asp-for="Carname"></label>
    <input class="input" type="text" asp-for="Carname">
    <select>
       <option> A carType </option>
       <option>A carType </option>
    </select>
</from>