2

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

5 回答 5

3

因为ViewData是一个Dictionary<string, Object>。你怎么能在一个键控集合中存储多种类型的对象?从没有强制转换的情况下检索到的任何内容ViewData都将被编译器视为 base Object

于 2010-06-12T00:30:29.490 回答
1

如果我没记错的话,ViewData 是一个对象数组/集合。这就是为什么需要额外演员表的原因。

于 2010-06-11T23:11:14.107 回答
0

显然,编译器不会自动执行从 object 类型的对象到另一种类型的强制转换。我希望 ViewData 的结果在编译时属于 object 类型。示例如下:

// 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);
于 2010-06-12T00:37:20.487 回答
0

这是因为一个称为“静态类型”的功能。有些人喜欢它,有些人讨厌它。

于 2010-06-12T00:38:47.320 回答
-1

如果你改变了怎么办

ViewData["TitleList"] = titles;

ViewData["TitleList"] = new SelectListItem() 
    { Value = t.ToString(), Text = t.ToString() };

并再次尝试:

Html.DropDownListFor(x => x.Title, ViewData["TitleList"])

如果这行得通,我会同意 Femaref....不过是个好问题。

于 2010-06-11T23:39:04.860 回答