В моем контроллере у меня есть следующее:

ViewData["myList"] = 
   new SelectList(itemRepository.GetAll(), "Id", "Name", currentItem.Id);

И в представлении у меня есть:

<%= Html.DropDownList("myItem", (SelectList)ViewData["myList"])%>

В отображаемом раскрывающемся списке должен быть элемент с предварительно выбранным идентификатором currentItem.Id, но это не так. Ничего не выбрано, поэтому по умолчанию используется первое.

Это работало до того, как я обновился до RC / RC (обновить). Любые идеи?

5
Iain Holder 26 Фев 2009 в 13:16
Это все еще проблема, с которой я сталкиваюсь с MVC 1.0
 – 
Andrew Harry
11 Июн 2009 в 06:48

3 ответа

Лучший ответ

Если вы сопоставите имя ключа в ViewData с именем поля формы в представлении, HtmlHelpers предназначены для неявного извлечения из ViewData на основе этого ключа. Я бы предложил изменить код вашего представления на:

<%= Html.DropDownList("myList") %>

Кажется, что HtmlHelpers лучше всего работают при использовании их таким образом (хотя это не всегда возможно).

Обновление:

Чтобы раскрыть причину, по которой это работает, а другие методы - нет, я погрузился в код SelectExtensions.cs ...

Как бы вы ни вызывали DropDownList, частный метод SelectInternal - это то, что в конечном итоге отображает фактический HTML. Подпись для SelectInternal выглядит так:

SelectInternal( string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool usedViewData, bool allowMultiple, IDictionary<string,object> htmlAttributes )

Вот путь, по которому идут два использования DropDownList:

DropDownList ("myList")

DropDownList( string name ) ->
SelectInternal( null, name, htmlHelper.GetSelectData(name), true, false, null )

DropDownList ("myItem", (SelectList) ViewData ["myList"]) Падать

List( string name, IEnumerable<SelectListItem> selectList ) ->
DropDownList( name, selectList, null /* object, htmlAttributes */ ) ->
DropDownList( name, selectList, new RouteValueDictionary(htmlAttributes) ) ->
SelectInternal( null, name, selectList, false, false, htmlAttributes )

Итак, в конце концов, разница между двумя путями заключается в том, что способ, который работает, передает true в параметр usedViewData SelectInternal, в то время как способ, который не работает, проходит ложь .

Мне кажется вероятным, что где-то внутри SelectInternal есть ошибка, когда usedViewData имеет значение false .

6
Troy 26 Фев 2009 в 20:32
Принимая в качестве ответа, как это работает. Но, надеюсь, @Haacked тоже это увидит.
 – 
Iain Holder
26 Фев 2009 в 20:10
Кстати, я должен быть уверен, что множественные вопросительные знаки не были адресованы вам властителями MVC.
 – 
Iain Holder
26 Фев 2009 в 21:45

У меня работает следующее (с использованием MVC RC Refresh)

В представлении:

<%= Html.DropDownList("NAME_OF_ITEM_ID_PROPERTY", (SelectList)ViewData["myList"]) %>

Итак, для вашего примера это, вероятно, будет:

<%= Html.DropDownList("Id", (SelectList)ViewData["myList"]) %>
0
kay.herzam 26 Фев 2009 в 15:35
Привет, Кей, разве это не сделало бы имя и идентификатор «Id»? Это было бы неправильно, поскольку мне нужно, чтобы имя и идентификатор были «myItem», поскольку это идентификатор, который ищет отправка формы.
 – 
Iain Holder
26 Фев 2009 в 16:00
Ты пробовал это? Также проверьте визуализированный HTML. Насколько я понимаю, в вашем контроллере вы определяете поле значения как идентификатор вашей модели элемента, а имя как значение SelectListItem. Итак, установив для первого параметра в раскрывающемся списке значение Id, вы запрашиваете это поле значения.
 – 
kay.herzam
26 Фев 2009 в 19:10
Да я пробовал. Первым параметром всегда является имя отображаемого раскрывающегося списка. Разве это не для тебя?
 – 
Iain Holder
26 Фев 2009 в 19:17

Я просто сделал свой собственный выпадающий помощник. Возможно, не так эффективно, как встроенный, но он работает.

0
Greg Ogle 13 Июл 2009 в 15:48