使用Automapper将模型传递给ViewModel

时间:2019-03-31 23:37:20

标签: c# asp.net automapper

我正在研究ASP.NET核心项目。我想使用自动映射器将模型映射到视图模型,但是下面描述了一个问题 这是 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的IEnumerable。我怎么掩饰他们?如果现在可以转换它们,那我该怎么办?如何传递数据以查看?

1 个答案:

答案 0 :(得分:1)

我建议更新automapper行以转换为List而不是IEnumerable接口,以便您可以确保在控制器内实现视图模型。很明显,查看存储库代码,但如果仅看到存储库返回IEnumerable,则不会。

下面的主要更改是确保AutoMapper映射到视图模型对象的列表,并且该视图正在接收由这些视图模型对象的列表组成的模型。我假设CarsVM对象是单个Cars对象的viewmodel实例。

存储库

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>