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

所以我的代码以前工作过。 我不知道我为此做了什么,我似乎无法修复它。 我见过有人说要重置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; } 

视图:

 
@Html.LabelFor(model => model.leaf.Category)
@Html.DropDownListFor(model => model.CategoryId, Model.CategoryItems, "") @Html.ValidationMessageFor(model => model.leaf.Category)

模型:

  public int CategoryId { get; set; } public IEnumerable CategoryItems { get; set; } 

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

 if( ModelState.IsValid ) { // save and redirect // ... } // repopulate your SelectList properties: model.CategoryItems = GetCategories(); return View(model); 

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

另一种我找到解决方案的方法是采取隐藏的领域。 所以在你的情况下你可以这样做:

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

现在使用另一个字段表单也发布并在各自的模型中设置CategoryId。