具有键“XXX”的ViewData项的类型为“System.Int32”

具有键“XXX”的ViewData项的类型为“System.Int32”

我有以下视图模型

public class ProjectVM{
    ....
    [Display(Name = "Category")]
    [Required(ErrorMessage = "Please select a category")]
    public int CategoryID { get; set; }
    public IEnumerable<SelectListItem> CategoryList { get; set; }
    ....}

和以下控制器方法创建一个新项目并分配一个 Category

public ActionResult Create(){
    ProjectVM model = new ProjectVM
    {
        CategoryList = new SelectList(db.Categories, "ID", "Name")
    }
    return View(model);}public ActionResult Create(ProjectVM model){
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    // Save and redirect}

并在视图中

@model ProjectVM....@using (Html.BeginForm()){
    ....
    @Html.LabelFor(m => m.CategoryID)
    @Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
    @Html.ValidationMessageFor(m => m.CategoryID)
    ....
    <input type="submit" value="Create" />}

视图显示正确但在提交表单时,我收到以下错误消息

InvalidOperationException:具有键“CategoryID”的ViewData项的类型为“System.Int32”,但必须是“IEnumerable <SelectListItem>”类型。

使用该@Html.DropDownList()方法会发生相同的错误,如果我使用ViewBag或传递SelectList ViewData


慕后森
浏览 1321回答 4
4回答

MMTTMM

根据斯蒂芬的回答,这可能很有用:@Html.DropDownListFor(m&nbsp;=>&nbsp;m.CategoryID,&nbsp;Model.CategoryList&nbsp;??&nbsp;new&nbsp;List<SelectListItem>(),&nbsp;"-Please&nbsp;select-")或在ProjectVM中:public&nbsp;class&nbsp;ProjectVM{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ProjectVM() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CategoryList&nbsp;=&nbsp;new&nbsp;List<SelectListItem>(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;...}

墨色风雨

最可能导致某种错误重定向到您的页面,而您又没有再次初始化模型的下拉列表。确保在模型的构造函数中或每次将所述模型发送到页面之前初始化下拉列表。否则,您需要通过视图包或隐藏值助手维护下拉列表的状态。

慕田峪7331174

我有同样的问题,当我试图发布表单时,我得到了一个无效的ModelState。对我来说,这是因为将CategoryId设置为int,当我将其更改为字符串时,ModelState有效且Create方法按预期工作。
打开App,查看更多内容
随时随地看视频慕课网APP