Почему Html.DropDownListFor требует дополнительного приведения? - PullRequest
2 голосов
/ 12 июня 2010

В моем контроллере я создаю список SelectListItems и сохраняю его в ViewData . Когда я читаю ViewData в моем View, это дает мне ошибку о неправильных типах. Если я приведу типы вручную, это работает, но кажется, что это должно произойти автоматически. Может кто-нибудь объяснить?

Контроллер

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;

View

// Doesn't work
Html.DropDownListFor(x => x.Title, ViewData["TitleList"])

// This Works
Html.DropDownListFor(x => x.Title, (List<SelectListItem>) ViewData["TitleList"])

Ответы [ 5 ]

3 голосов
/ 12 июня 2010

Потому что ViewData - это Dictionary<string, Object>. Как еще можно хранить объекты нескольких типов в коллекции ключей? Все, извлеченное из ViewData без приведения, будет рассматриваться компилятором как базовое Object.

1 голос
/ 12 июня 2010

Если я правильно помню, ViewData - это массив / коллекция объектов.Вот почему требуется дополнительный актерский состав.

0 голосов
/ 12 июня 2010

Это из-за функции, называемой «статическая типизация».Некоторые любят это, другие ненавидят.

0 голосов
/ 12 июня 2010

Очевидно, компилятор не будет выполнять приведение объекта типа объект к другому типу автоматически.Я ожидаю, что результаты из 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);
0 голосов
/ 12 июня 2010

что делать, если вы измените

ViewData["TitleList"] = titles;

на

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

и попробуйте снова:

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

, если это работает, я согласенFemaref .... хороший вопрос, хотя.

...