具有键'MY KEY'的ViewData项的类型为'System.String',但必须是'IEnumerable <SelectListItem>类型的'

JBi*_*bbs 141 asp.net-mvc

我试图使用ASP.NET MVC 2从使用Linq-2-SQL映射的数据库填充下拉列表,并继续收到此错误.

我很困惑,因为我IEnumerable<SelectListItem>在第二行声明了一个类型的变量,但错误让我觉得情况并非如此.我觉得这应该很简单,但我很挣扎.任何帮助表示赞赏.

以下是我的控制器的有趣内容:

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();
}
Run Code Online (Sandbox Code Playgroud)

以下是我观点的有趣内容:

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

这是提交表单时的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Pet*_*eto 204

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

问题是在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;
Run Code Online (Sandbox Code Playgroud)

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

这将解决您的问题:

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这个问题已经很老了,但是今天我带着同样的问题来到这里,所以其他人可能会来这里...

  • +1"再次填充"...我有一个相当强大的系统来组成我的视图模型,但我完全忘了称它.因此,该属性没有填充,无论我尝试什么,我都收到了这个(相当模糊的)消息. (8认同)
  • 如果你在帖子之前得到这个,那是因为SelectList中没有任何东西,只是发现了一个. (8认同)

Ben*_*Ben 86

如果SelectList为null,您将收到此错误.

  • 呃,这么简单,但误导性的错误信息. (15认同)
  • 是的,这是一个常见的错误/监督,当你设置选择列表的一个GET然后回发到一个POST操作(显然)有一个'ModelState.IsValid == FALSE`所以你返回到模型`返回查看(模型)`但是在从POST返回之前不要重新填充SelectList源.由于没有ViewState ala WebForms,因此`@ Html.DropDown`助手没有来源来重建select.每次将视图返回给客户端时,您必须填充该源列表,而不仅仅是在GET上. (3认同)
  • 我知道这很老了,但是,你的答案救了我!!! 实际上,错误是误导性的 (2认同)