为什么在将 ViewModel 传递给 View 时会出现此错误?

时间:2021-06-09 09:43:34

标签: c# asp.net-mvc asp.net-core view viewmodel

将 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; }
(...)

为什么会出现上述错误?

谢谢。

6 个答案:

答案 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 
相关问题