首页 > 解决方案 > 具有键“HousingId”的 ViewData 项的类型为“System.Int32”,但必须为“IEnumerable”类型’。”

问题描述

我有一个正在开发的 MVC 应用程序。我有一个运行良好的应用程序创建视图。但我想创建一个局部视图,以便可以在索引中调用它。然而,部分观点抛出

System.InvalidOperationException:“具有键“HousingId”的 ViewData 项的类型为“System.Int32”,但必须为“IEnumerable”类型

在这行代码上:

@Html.DropDownList("HousingId", (IEnumerable<SelectListItem>)ViewBag.Housings, htmlAttributes: new { @class = "form-control" })

然而,这行代码在正常的 Create 视图中运行良好。这是我的控制器:

public ActionResult Create()
{
    var housings = new SelectList(_db.Housings.ToList(), "HousingId", "Name");
    ViewBag.Housings = housings;
    return View();
}

我错过了什么?

编辑:这是我传递部分的方式

@model IEnumerable<Housing_RedBadgeMVC.Models.ApplicationModels.ApplicationListItem>

...

@foreach (var item in Model)
{
    <div class="create-housing-container">
        <p style="color: white; font-size: 12px;">
            Here you can view current applications for specific housing,
            if you'd like to fill out an application please click
            @Html.Partial("_ApplicationCreate", item)
        </p>
    </div>
}

...

以及部分内容:

@model Housing_RedBadgeMVC.Models.ApplicationModels.ApplicationListItem

...

@using (Html.BeginForm("Create", "Application", new { id = Model.HousingId }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        @Html.LabelFor(model => model.HousingId, "Housing", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("HousingId", (IEnumerable<SelectListItem>)ViewBag.Housings, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.HousingId, "", new { @class = "text-danger" })
        </div>
    </div>
}

...

标签: c#asp.netasp.net-mvc

解决方案


它说 Dropdownlist 必须是 List ,因为您只是传递单个对象,例如var

改变这个:

var housings = new SelectList(_db.Housings.ToList(), "HousingId", "Name");

IEnumerable<SelectListItem> housings = new SelectList(_db.Housings.ToList(), "HousingId", "Name");

编辑

尝试这个:

IEnumerable<SelectListItem> housings = db.Housings.Select(
    b => new SelectListItem { Value = b.HousingId, Text = b.Name}).ToString();
ViewBag.Housings = housings;

推荐阅读