在我的控制器中,我创建了一个 SelectListItems 列表,并将其存储在 ViewData 中。当我在View中阅读ViewData时,它给出了一个关于错误类型的错误。如果我手动转换它的工作类型,但似乎这应该自动发生。有人可以解释一下吗?
控制器:
enum TitleEnum { Mr, Ms, Mrs, Dr };
var titles = new List<SelectListItem>();
foreach(var t in Enum.GetValues(typeof(TitleEnum)))
titles.Add(new SelectListItem()
{ Value = t.ToString(), Text = t.ToString() });
ViewData["TitleList"] = titles;
查看:
// Doesn't work
Html.DropDownListFor(x => x.Title, ViewData["TitleList"])
// This Works
Html.DropDownListFor(x => x.Title, (List<SelectListItem>) ViewData["TitleList"])
答案 0 :(得分:3)
因为ViewData
是Dictionary<string, Object>
。如何在密钥集合中存储多种类型的对象?在没有强制转换的情况下从ViewData
检索的任何内容都将被编译器视为基础Object
。
答案 1 :(得分:1)
如果我没记错的话,ViewData是一个对象的数组/集合。这就是需要额外演员的原因。
答案 2 :(得分:0)
显然编译器不会自动从 object 类型的对象执行转换为其他类型。我希望ViewData的结果在编译时是对象类型。示例如下:
// This Fails
object obj = new List<SelectListItem>();
Html.DropDownListFor(x => x.Title, obj);
// This Works
var obj2 = new List<SelectListItem>();
Html.DropDownListFor(x => x.Title, obj2);
答案 3 :(得分:0)
这是因为称为“静态类型”的功能。有些人喜欢它,有些人则讨厌它。
答案 4 :(得分:-1)
如果你改变了怎么办
ViewData["TitleList"] = titles;
到
ViewData["TitleList"] = new SelectListItem()
{ Value = t.ToString(), Text = t.ToString() };
再次尝试:
Html.DropDownListFor(x => x.Title, ViewData["TitleList"])
如果这样有效,我会赞同Femaref ....但问题很好。