使用数据库数据填充DropDownList时出错

时间:2013-08-23 14:05:11

标签: asp.net-mvc asp.net-mvc-4 razor html-select

在我看来,我有一个DropDownList,我填充了数据库数据。但是当我运行它时,我得到一个我真不理解的错误:

“没有类型'IEnumerable'的ViewData项具有键'DdlBagTypes'。”

我不知道如何做到这一点,但我查找了各种解决方案,这就是我的方法:

从数据库获取数据的功能:

public IEnumerable<SelectListItem> getBagelTypes()
    {
        return (from t in Db.BagelType.AsEnumerable()
                select new SelectListItem
                {
                    Text = t.Name,
                    Value = t.BagelTypeId.ToString(),
                }).AsEnumerable();             
    }

控制器:

public ActionResult Index()
    {
        ViewData["LstBagels"] = DbO.getBagels();
        TempData["LstTypeOptions"] = DbO.getBagelTypes();
        Session["OrderCount"] = OrderCount;

        return View();
    }

查看:

@model BestelBagels.Models.Bagel
@{
ViewBag.Title = "Home Page";

var LstBagels = ViewData["LstBagels"] as List<BestelBagels.Models.Bagel>;
var LstTypeOptions = TempData["LstTypeOptions"] as IEnumerable<SelectList>;
var OrderCount = Session["OrderCount"];
}

@Html.DropDownList("DdlBagTypes", (SelectList)LstTypeOptions)

1 个答案:

答案 0 :(得分:3)

而不是TempData使用ViewData将数据传递给视图:

ViewData["LstTypeOptions"] = DbO.getBagelTypes();

并在您的视图中:

var LstTypeOptions = ViewData["LstTypeOptions"] as IEnumerable<SelectListItem>;

然后:

@Html.DropDownList("DdlBagTypes", LstTypeOptions)

还要注意正确的类型IEnumerable<SelectListItem>,这是getBagelTypes函数返回的内容。在您的示例中,您试图转换为IEnumerable<SelectList>,显然会返回null,因为这不是您存储在TempData中的内容。

但我个人会抛弃这个ViewData的东西并引入一个视图模型:

public class MyViewModel
{
    public string SelectedOption { get; set; }
    public IEnumerable<SelectListItem> LstTypeOptions { get; set; }

    public string SelectedBagel { get; set; }
    public IEnumerable<SelectListItem> LstBagels { get; set; }

    public int OrderCount { get; set; }
}

我会在我的控制器操作中填充并传递给视图:

public ActionResult Index()
{
    var model = new MyViewModel();
    model.LstTypeOptions = DbO.getBagelTypes();
    model.LstBagels = DbO.getBagels();
    model.OrderCount = OrderCount;

    return View(model);
}

最后我会将我的视图强烈输入视图模型并使用强类型帮助器:

@model MyViewModel
...
@Html.DropDownListFor(x => x.SelectedOption, Model.LstTypeOptions)
@Html.DropDownListFor(x => x.SelectedBagel, Model.LstBagels)
...
<div>You have a total of @Html.DisplayFor(x => x.OrderCount) orders</div>