在我看来,我有一个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)
答案 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>