具有“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。; 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() { /* ... */ })
那么你的局部视图将不会看到ViewData
和ViewBag
数据,删除new ViewDataDictionary()
对于未来的读者,
我今天遇到这个问题,无法修复。 毕竟它变得非常简单。 我正在使用表格+视图。 当我更新表(添加了几个colums)时,我忘了更新(删除并重新创build)视图,这对我造成了问题。 希望它有助于某人。
- ASP.NET MVC实现自定义validation器使用IClientValidatable
- 把内容放在HttpResponseMessage对象中?
- ASP.NET MVC 2 – 与jQuery的Ajax响应失败
- 我如何testingModelState?
- 如何使用Ajax.ActionLink?
- ActionName的用途
- 有没有解决ASP.NET MVC的ContactsManager教程中的dependency injection循环问题的好方法?
- ASP.NET MVC中的Redirect和RedirectToAction有什么区别?
- unit testingASP.NET DataAnnotationsvalidation