具有键“CategoryId”的 ViewData 项的类型为“System.Int32”,但必须为“IEnumerable<SelectListItem>”类型?

Posted

技术标签:

【中文标题】具有键“CategoryId”的 ViewData 项的类型为“System.Int32”,但必须为“IEnumerable<SelectListItem>”类型?【英文标题】:The ViewData item that has the key 'CategoryId' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'? 【发布时间】:2012-01-25 14:10:01 【问题描述】:

所以我的代码以前可以工作。我不知道我做了什么导致这种情况发生,我似乎无法解决它。我见过有人说要重置 ModelState。 ( ModelState.Clear(); ) 但这并没有帮助。此外,我对 MVC 还很陌生,这也无济于事。任何帮助,将不胜感激。谢谢。

控制器:

    public ActionResult Create()
    
        ActiveDirectoryModel adm = new ActiveDirectoryModel();
        ViewBag.notifyto = adm.FetchContacts();
        var model = Populate();


        return View(model);
     

    [HttpPost]
    public ActionResult Create(CreateViewModel model)
    
        if (ModelState.IsValid)
        
            model.leaf.Date = DateTime.Now.Date;
            model.leaf.Category = model.CategoryId;
            model.leaf.SubCategory = model.SubCategoryId;
            model.leaf.AssignedTo = model.AssignedToId;
            model.leaf.CoAssignedTo = model.CoAssignedToId;
            model.leaf.Status = model.StatusId;
            model.leaf.Priority = model.PriorityId;
            //model.lead.Parent = model.ParentID;

            db.LeafItems.AddObject(model.leaf);
            db.SaveChanges();
            return RedirectToAction("Index");
        

        return View(model);
    

    public CreateViewModel Populate()
    
        ActiveDirectoryModel adm = new ActiveDirectoryModel();
        var model = new CreateViewModel
        
            AssignedToItems = adm.FetchContacts(),
            CoAssignedToItems = adm.FetchContacts(),
            NotifyToItems = adm.FetchContacts(),
            CategoryItems =
                from c in new IntraEntities().CategoryItems.ToList()
                select new SelectListItem
                
                    Text = c.Name,
                    Value = c.ID.ToString()
                ,
            SubCategoryItems =
                from sc in new IntraEntities().SubCategoryItems.ToList()
                select new SelectListItem
                
                    Text = sc.Name,
                    Value = sc.ID.ToString()
                ,
            StatusItems =
                from s in new IntraEntities().StatusItems.ToList()
                where s.IsPriority == false
                select new SelectListItem
                
                    Text = s.Name,
                    Value = s.ID.ToString()
                ,
            PriorityItems =
                from p in new IntraEntities().StatusItems.ToList()
                where p.IsPriority == true
                select new SelectListItem
                
                    Text = p.Name,
                    Value = p.ID.ToString()
                
        ;
        return model;
    

查看:

<div class="createTopInner">
    <div class="editor-label">
        @html.LabelFor(model => model.leaf.Category)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.CategoryId, Model.CategoryItems, "")
        @Html.ValidationMessageFor(model => model.leaf.Category)
    </div>
</div>

型号:

    public int CategoryId  get; set; 
    public IEnumerable<SelectListItem> CategoryItems  get; set; 

【问题讨论】:

如果 ModelState.IsValid = false,我通过运行我的填充方法解决了这个问题。 8小时过去后,我可以将其发布为真正的答案。我只是不希望任何人在那之前浪费他们的时间。 【参考方案1】:

我找到解决方案的另一种方法是采用隐藏字段。因此,在您的情况下,您可以执行以下操作:

@Html.HiddenFor(model => model.CategoryId)

现在使用另一个字段表单也在相应的模型中发布和设置 CategoryId。

【讨论】:

【参考方案2】:

如果您的 ModelState 在您的 POST 操作中无效,您需要重新填充您的 SelectList 属性:

if( ModelState.IsValid ) 

    // save and redirect
    // ...


// repopulate your SelectList properties:
model.CategoryItems = GetCategories();

return View(model);

不要重新填充整个模型,否则您可能会丢失用户所做的任何更改。

【讨论】:

谢谢。它仍然保留着价值。但是您的解决方案显然是更安全的途径。 @Dismissile 你能提供更多关于它的信息吗?为什么我们需要重新填充选择列表,它是否有任何副作用。谢谢 @AvneeshSrivastava MVC 是无状态的。当您执行 POST 时,它将重新渲染整个视图,并且您之前未在 POST 中发送的所有数据都将丢失。当您提交表单时,您只会提交选定的值,而不是整个项目列表。您需要重新填充它,以便它再次拥有完整列表。

以上是关于具有键“CategoryId”的 ViewData 项的类型为“System.Int32”,但必须为“IEnumerable<SelectListItem>”类型?的主要内容,如果未能解决你的问题,请参考以下文章

具有键“XXX”的 ViewData 项属于“System.Int32”类型,但必须属于“IEnumerable<SelectListItem>”类型

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

加载 HTML 时出现 MVC 错误。具有键“MY KEY”的 ViewData 项属于“System.String”类型,但必须属于“IEnumerable<SelectListItem>

没有键为“Conve”的“IEnumerable”类型的 ViewData 项

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。

ASP.NET-viewBag Viewdata Tempdata