首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有键“”MY ViewData“”的密钥项的类型为“”System.String“”,但必须为“”IEnumerable<SelectListItem>“”类型“”

具有键“”MY ViewData“”的密钥项的类型为“”System.String“”,但必须为“”IEnumerable<SelectListItem>“”类型“”
EN

Stack Overflow用户
提问于 2010-08-03 12:09:40
回答 9查看 100K关注 0票数 144

我试图使用ASP.NET MVC2从一个用Linq- 2 -SQL映射的数据库中填充一个下拉列表,但一直收到这个错误。

我很困惑,因为我在第二行声明了一个IEnumerable<SelectListItem>类型的变量,但这个错误让我认为情况并非如此。我觉得这应该是非常简单的,但我正在努力。任何帮助都是非常感谢的。

下面是我的控制器的一些有趣的地方:

代码语言:javascript
复制
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();
}

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

代码语言:javascript
复制
<div class="editor-label">
   <%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
   <%: Html.DropDownList("basetype") %>
   <%: Html.ValidationMessageFor(model => model.basetype) %>
</div>

下面是提交表单时的POST操作

代码语言:javascript
复制
// 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);
    }
}

谢谢。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-06-28 20:53:20

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

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

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

代码语言:javascript
复制
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)之前。

这就解决了你的问题:

代码语言:javascript
复制
[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);
    }
}

我知道这个问题很老了,但我今天带着同样的问题来到这里,所以其他人可以稍后来这里……

票数 209
EN

Stack Overflow用户

发布于 2014-10-09 03:15:41

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

票数 88
EN

Stack Overflow用户

发布于 2011-04-04 19:58:30

我刚刚遇到这个问题,这篇文章帮助我解决了这个问题-- http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc.aspx

最可能的原因是您的集合在po之后被重新填充

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3393521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档