【发布时间】:2021-06-09 09:43:34
【问题描述】:
将 ViewModel 传递给 View 时出现错误
传入 ViewDataDictionary 的模型项是类型 'System.Collections.Generic.List'1[TraficAlert.Models.TaBarHeader]', 但是这个 ViewDataDictionary 实例需要一个类型的模型项 'System.Collections.Generic.IEnumerable'1[TraficAlert.Models.ViewModels.HeaderTelegramaViewModel]'。
我尝试在Index.cshtml 中使用@model IEnumerable<TraficAlert.Models.ViewModels.HeaderTelegramaViewModel>,它可以工作,但我需要从HeaderTelegramaViewModel 访问属性。
Index.cshtml:
@model IEnumerable<TraficAlert.Models.ViewModels.HeaderTelegramaViewModel>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.TaBarHeader.Id)
</th>
<th>
@Html.DisplayNameFor(model => model.TaBarHeader.ParentId)
</th>
<th>
@Html.DisplayNameFor(model => model.TaBarHeader.TStamp)
</th>
(...)
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.TaBarHeader.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.TaBarHeader.ParentId)
</td>
<td>
@Html.DisplayFor(modelItem => item.TaBarHeader.TStamp)
</td>
(...)
<td>
<a asp-action="Edit" asp-route-id="@item.TaBarHeader.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.TaBarHeader.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.TaBarHeader.Id">Delete</a>
</td>
</tr>
}
</tbody>
</table>
HeaderTelegramaController:
(...)
public IActionResult Index()
{
var applicationDbContext = _unitofwork.BarHeader.GetAllBarH().ToList();
return View(applicationDbContext);
}
TaBarHeaderRepository:
public IEnumerable<TaBarHeader> GetAllBarH()
{
return _db.TaBarHeaders
.Include(t => t.CategoriaFk)
.Include(t => t.CauzaFk)
.Include(t => t.ClasaFk)
.Include(t => t.LucrareFk)
.Include(t => t.RegionalaFk)
.Include(t => t.UserFk);
}
HeaderTelegramaViewModel:
public TaBarHeader TaBarHeader { get; set; }
public IEnumerable<SelectListItem> Categoria { get; set; }
public IEnumerable<ViewOtf> ViewOTFCollection { get; set; }
(...)
为什么会出现上述错误?
谢谢。
【问题讨论】:
-
正如错误消息所说,它预期
HeaderTelegramaViewModel的集合,但您已经传递了TaBarHeader的集合。您必须将TaBarHeader的集合映射到HeaderTelegramaViewModel的集合,或者更改视图的@model -
我在
HeaderTelegramaViewModel中创建了public IEnumerable<TaBarHeader> TaBarHeaders { get; set; },并在没有IEnumerable 的情况下更改了@model,但不起作用。 -
GetAllBarH返回 TypeA 并且您的视图需要 TypeB。根据提供的代码,两者之间没有隐式转换。因此,问题与List或IEnumerable无关,而是与它们的参数化类型有关。 -
现在我明白了。但是,我对如何在方法
GetAllBarH()中使用HeaderTelegramaViewModel以及这样做的良好做法有点困惑。 -
您不应该在您的
GetAllBarH中使用HeaderTelegramaViewModel。映射应该在 Controller 的 Action 内完成。您可以手动完成,也可以使用 3rd 方库,例如 AutoMapper
标签: c# asp.net-mvc asp.net-core view viewmodel