我正在研究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。我怎么掩饰他们?如果现在可以转换它们,那我该怎么办?如何传递数据以查看?
答案 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>