Что не так с моим ASP.NET MVC SelectList? - PullRequest
2 голосов
/ 17 января 2010

Я пытаюсь использовать SelectList для одного из моих представлений, и он просто не заполняется правильно. Он получает правильное количество записей (4), но все они читают System.Web.Mvc.SelectListItem. Я запустил отладчик кода и увидел, что происходит какая-то странность. Должно быть, я что-то делаю не так, но я не совсем понимаю, что.

Код из ViewModel:

public SelectList DeviceTypes {get; private set;}
....
var device_types = DataTableHelpers.DeviceTypes(); 
IEnumerable<SelectListItem> sl = device_types.Select(
                      dt => new SelectListItem { Selected = (dt.DeviceType == 1),
                      Text = dt.Description, 
                      Value = dt.DeviceType.ToString() }).ToList();
DeviceTypes = new SelectList(sl);

И код из вида:

<%= Html.DropDownList("Type",Model.DeviceTypes) %>

Итак, когда я смотрю на это в отладчике, sl IEnumerable создается правильно. Я вижу все 4 элемента с правильными значениями свойств Text и Value. Однако, когда я вызываю конструктор SelectList, если я раскрываю IEnumerable, который он содержит, я вижу, что в нем 4 записи, но все данные в них потеряны. Текст установлен на System.Web.Mvc.SelectListItem, а значение null.

Я попытался изменить ToList() вызов на ToArray(), а также полностью удалить его. Это не изменило поведение.

Что я здесь не так делаю?

1 Ответ

4 голосов
/ 17 января 2010

РЕДАКТИРОВАТЬ: Поцарапать мой первый ответ.

Вы должны передавать список IEnumerable, если элементы в View, не пытаясь создать элемент Html в контроллере.

Код для контроллера:

public IEnumberable<YourModel> DeviceTypes {get; internal set;}
....
DeviceTypes = DataTableHelpers.DeviceTypes();

Код для просмотра:

<%= Html.DropDownList("Type", from dt in Model.DeviceTypes
                              select new SelectListItem
                              {
                                  Text = dt.Description,
                                  Value = dt.DeviceType.ToString(),
                                  Selected = dt.DeviceType == 1
                              }) %>
...