脚手架模型/视图:具有键“COLUMN”的 ViewData 项属于“System.String”类型,但必须属于“IEnumerable<SelectListItem>”类型

Posted

技术标签:

【中文标题】脚手架模型/视图:具有键“COLUMN”的 ViewData 项属于“System.String”类型,但必须属于“IEnumerable<SelectListItem>”类型【英文标题】:Scaffolded model/view: The ViewData item that has the key 'COLUMN' is of type 'System.String' but must be of type 'IEnumerable<SelectListItem>' 【发布时间】:2018-05-12 09:42:18 【问题描述】:

我知道有anumberofquestionsaskedsimilar对此,但他们似乎都在处理一个加载正常的页面并且在尝试发布时出现问题.我在带有代码优先数据库的 MVC 项目中使用脚手架代码。失败的下拉菜单应该由外键关系填充,还有两个其他下拉菜单使用完全相同的代码但名称不同,并且评论表明只有这个下拉菜单不好。这应该在编辑中,但页面甚至不会像其他问题那样加载以提交数据。创建和编辑页面都不会加载。

说了这么多,这就是控制器:

public ActionResult Edit(long? id)

    if (id == null)
    
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    
    Person person = db.People.Find(id);
    if (person == null)
    
        return HttpNotFound();
    
    ViewBag.Title = new SelectList(db.Job_Title, "Id", "Title", person.Title);
    ViewBag.Location = new SelectList(db.Locations, "Id", "Name", person.Location);
    ViewBag.Manager = new SelectList(db.Managers, "Id", "Name", person.Manager);
    return View(person);

这是相应视图的一部分:

<div class="form-group">
    @html.LabelFor(model => model.Title, "Title", htmlAttributes: new  @class = "control-label col-md-2" )
    <div class="col-md-10">
        @*FIXME: Commenting the line below will allow the page to load fine*@
        @Html.DropDownList("Title", null, htmlAttributes: new  @class = "form-control" )
        @Html.ValidationMessageFor(model => model.Title, "", new  @class = "text-danger" )
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.Location, "Location", htmlAttributes: new  @class = "control-label col-md-2" )
    <div class="col-md-10">
        @Html.DropDownList("Location", null, htmlAttributes: new  @class = "form-control" )
        @Html.ValidationMessageFor(model => model.Location, "", new  @class = "text-danger" )
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.Manager, "Manager", htmlAttributes: new  @class = "control-label col-md-2" )
    <div class="col-md-10">
        @Html.DropDownList("Manager", null, htmlAttributes: new  @class = "form-control" )
        @Html.ValidationMessageFor(model => model.Manager, "", new  @class = "text-danger" )
    </div>
</div>

我很想知道为什么只有标题下拉菜单会杀死页面,而其他两个完全没问题。我也很想知道为什么生成脚手架代码时出错!

【问题讨论】:

【参考方案1】:

错误意味着ViewBag.Title 的值是null 或不是IEnumerable&lt;SelectListItem&gt;

这会发生,因为您的视图包含

@
    ViewBag.Title = ".....";
@

这会覆盖您在 GET 方法中设置的值。

【讨论】:

好收获!您可以将 viewbag 项目名称更改为 ViewBag.TitleList 并更新 UI 代码以使用它。 @Html.DropDownList("Title",ViewBag.TitleList as SelectList) 甚至更好地使用具有属性名称的视图模型,这是有意义的 @Shyju,除非您编辑已设置 Title 值的现有对象(始终选择第一个选项,而不是正确的选项)。一如既往,最好用一个视图模型,然后把属性名改成Salutation @StephenMuecke 好的,所以我在文件顶部看到了这一行,但我对建议的解决方案有点困惑。由于这是脚手架,我没有编写视图模型,所以我需要在哪里进行更改? 您正在编辑数据,因此始终使用视图模型。 (参考What is ViewModel in MVC?)。您的视图模型将包含一个属性(例如)int? JobTitle 和一个[Required] 属性,以及IEnumerable&lt;SelectListItem&gt; JobList,以及视图中的@Html.DropDownListFor(m =&gt; m.JobTitle, Model.JobList, "Please select", new ... )(以及视图中您需要的模型的其他属性)。不要在视图中使用数据模型,尤其是在编辑数据时。

以上是关于脚手架模型/视图:具有键“COLUMN”的 ViewData 项属于“System.String”类型,但必须属于“IEnumerable<SelectListItem>”类型的主要内容,如果未能解决你的问题,请参考以下文章

Scaffold Rails 3 视图中的外键下拉列表

使用外键关系创建 Rails 模型和脚手架的教程 [关闭]

在创建控制器和模型之后(仅)创建 Ruby on Rails 视图

如何通过主干中的 ajax 调用使用模型渲染多个视图

使用模型更改更新脚手架控制器和视图

Asp.Net MVC 从模型创建视图脚手架不生成 int 属性