具有“MY KEY”键的ViewData项目types为“System.String”,但必须是“IEnumerable <SelectListItem>”types

我正在尝试从使用ASP.NET MVC 2映射Linq-2-SQL的数据库填充下拉列表,并不断收到此错误。

我很困惑,因为我在第二行声明了一个IEnumerable<SelectListItem>types的variables,但是这个错误让我觉得不是这样。 我觉得这应该很简单,但我很挣扎。 任何帮助表示赞赏。

这里是我的控制器有趣的部分:

 public ActionResult Create() { var db = new DB(); IEnumerable<SelectListItem> basetypes = db.Basetypes.Select( b => new SelectListItem { Value = b.basetype, Text = b.basetype }); ViewData["basetype"] = basetypes; return View(); } 

以下是我的观点中有趣的部分:

 <div class="editor-label"> <%: Html.LabelFor(model => model.basetype) %> </div> <div class="editor-field"> <%: Html.DropDownList("basetype") %> <%: Html.ValidationMessageFor(model => model.basetype) %> </div> 

提交表单时,这是POST操作

 // POST: /Meals/Create [HttpPost] public ActionResult Create(Meal meal) { if (ModelState.IsValid) { try { // TODO: Add insert logic here var db = new DB(); db.Meals.InsertOnSubmit(meal); db.SubmitChanges(); return RedirectToAction("Index"); } catch { return View(meal); } } else { return View(meal); } } 

谢谢。

我有同样的问题,最后我得到了答案…

问题是,在POST操作中,提交表单后,ModelState无效,或者在try / catch中捕获错误,所以返回View。 但是这次View没有正确设置ViewData["basetype"]

您需要重新填充它,可能使用之前使用的相同代码,请重复此操作:

 var db = new DB(); IEnumerable<SelectListItem> basetypes = db.Basetypes.Select( b => new SelectListItem { Value = b.basetype, Text = b.basetype }); ViewData["basetype"] = basetypes; 

之前在[HttpPost]方法中return View(meal)

正好这将解决你的问题:

 [HttpPost] public ActionResult Create(Meal meal) { if (ModelState.IsValid) { try { // TODO: Add insert logic here var db = new DB(); db.Meals.InsertOnSubmit(meal); db.SubmitChanges(); return RedirectToAction("Index"); } catch { var db = new DB(); IEnumerable<SelectListItem> basetypes = db.Basetypes.Select( b => new SelectListItem { Value = b.basetype, Text = b.basetype }); ViewData["basetype"] = basetypes; return View(meal); } } else { var db = new DB(); IEnumerable<SelectListItem> basetypes = db.Basetypes.Select( b => new SelectListItem { Value = b.basetype, Text = b.basetype }); ViewData["basetype"] = basetypes; return View(meal); } } 

我知道这个问题很老,但今天我来到这里也遇到同样的问题,所以其他人可能晚点来。

如果SelectList为空,您将收到此错误。

我刚刚遇到这个问题,这篇文章帮助我通过它 – http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc&#x3002; ASPX

最有可能的原因是你的collections在po之后被重新填充

尝试为下拉列表的名称添加一个string作为第一个参数,然后从viewdata中获取项目:

  <%= Html.DropDownList("SomeDropdownName", (IEnumerable<SelectListItem>)ViewData["basetype"]) %> 

这里也是一个可以使用的扩展方法,所以下拉列表的设置方式与您的其他控件类似。

  public static string DropDownList<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel) where TModel : class { string inputName = ExpressionHelper.GetInputName(expression); return htmlHelper.DropDownList(inputName, selectList, optionLabel); } 

例如

 <%= Html.DropDownList(x => x.BaseType, (IEnumerable<SelectListItem>)ViewData["basetype"], "")%> 

您将集合设置为ViewData字典中的项目,并尝试将其作为属性在模型中进行检索。 一个简单的解决办法是引用它,就像你设置它一样:

  <%var basetype = ViewData["basetype"] as IEnumerable<SelectListItem>;%> <div class="editor-label"> <%: Html.Label("basetype") %> </div> <div class="editor-field"> <%: Html.DropDownList("basetype", basetype) %> <%: Html.ValidationMessage("basetype") %> </div> 

或者,下面的代码使用强types视图:

 public class ViewModel { //Model properties public IEnumerable<SelectListItem> basetype {get;set;} } public ActionResult Create() { var db = new DB(); IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(b => new SelectListItem { Value = b.basetype, Text = b.basetype }); return View(new ViewModel { basetype=basetypes }); } 

然后,在您的强types视图中:

  <div class="editor-label"> <%: Html.LabelFor(model => model.basetype) %> </div> <div class="editor-field"> <%: Html.DropDownListFor(model=>model.basetype) %> <%: Html.ValidationMessageFor(model => model.basetype) %> </div> 

如果使用Html.DropDownList()方法 – 如果您的ViewData / Viewbag项目未设置,则可能会出现同样的错误,如@Peto所回答的。

但是,在控制器正确设置项目的情况下,它可能不会被设置,但在主视图中使用新的ViewDataDictionary值使用部分viw调用。

如果你有@Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })那么你的局部视图将不会看到ViewDataViewBag数据,删除new ViewDataDictionary()

对于未来的读者,

我今天遇到这个问题,无法修复。 毕竟它变得非常简单。 我正在使用表格+视图。 当我更新表(添加了几个colums)时,我忘了更新(删除并重新创build)视图,这对我造成了问题。 希望它有助于某人。