为什么Html.DropDownListFor需要额外的演员?

时间:2010-06-11 23:09:33

标签: c# asp.net-mvc enums html-helper viewdata

在我的控制器中,我创建了一个 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"])

5 个答案:

答案 0 :(得分:3)

因为ViewDataDictionary<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 ....但问题很好。