将 ViewModel 传递给 View 时出现错误
<块引用>传入 ViewDataDictionary 的模型项是类型 'System.Collections.Generic.List'1[TraficAlert.Models.TaBarHeader]', 但是这个 ViewDataDictionary 实例需要一个类型为的模型项 'System.Collections.Generic.IEnumerable'1[TraficAlert.Models.ViewModels.HeaderTelegramaViewModel]'。
我尝试在 @model IEnumerable<TraficAlert.Models.ViewModels.HeaderTelegramaViewModel>
中使用 Index.cshtml
并且它有效,但我需要从 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; }
(...)
为什么会出现上述错误?
谢谢。
答案 0 :(得分:0)
使用 :: @model TraficAlert.Models.ViewModels.HeaderTelegramaViewModel
而不是 ::@model IEnumerable
在 index.cshtml 页面顶部
答案 1 :(得分:0)
查看模型的类型 IEnumerable
public IActionResult Index()
{
var applicationDbContext = _unitofwork.BarHeader.GetAllBarH();
return View(applicationDbContext);
}
答案 2 :(得分:0)
我认为可能的错误可能来自您的表头
尝试指定一个索引,考虑到您的模型是 IEnummerable。所以@Html.DisplayFor(modelItem => item.TaBarHeader.Id)
到这样的事情@Html.DisplayFor(modelItem => item[0].TaBarHeader.Id)
答案 3 :(得分:0)
在 cshtml 中使用下面的模型。
@model TraficAlert.Models.ViewModels.HeaderTelegramaViewModel
并在 Index() 中创建一个 HeaderTelegramaViewModel 的实例:
var _HeaderTelegramaViewModel = new HeaderTelegramaViewModel();
_HeaderTelegramaViewModel.TaBarHeader = TaBarHeader;
并且类 HeaderTelegramaViewModel 必须有:
public IEnumerable<TaBarHeader> TaBarHeader { get; set; }
public IEnumerable<SelectListItem> Categoria { get; set; }
public IEnumerable<ViewOtf> ViewOTFCollection { get; set; }
答案 4 :(得分:0)
错误消息相当清楚地解释了问题:您传入的类型与视图预期的类型不同。
具体来说,您调用 GetAllBarH()
来获取视图的数据,它返回 IEnumerable<TaBarHeader>
。因此页面的 model
声明应该是:
@model IEnumerable<TraficAlert.Models.TaBarHeader>
如果您真的想要 HeaderTelegramaViewModel
,那么您将不得不以某种方式转换 IEnumerable<TaBarHeader>
。我假设您错过了控制器中的那一步。
答案 5 :(得分:0)
为什么会出现上述错误?
因为在您的操作中返回的数据类型与视图中所需的数据类型不同。
您可以像这样修改您的 HeaderTelegramaController:
SEQUENCE INSTANCE NAME LOGNUMBER DATAFLAG
100 200 APPLE 20
103 203 BANANA 50
105 205 CHERRY 60