В моем контроллере у меня есть следующее:
ViewData["myList"] =
new SelectList(itemRepository.GetAll(), "Id", "Name", currentItem.Id);
И в представлении у меня есть:
<%= Html.DropDownList("myItem", (SelectList)ViewData["myList"])%>
В отображаемом раскрывающемся списке должен быть элемент с предварительно выбранным идентификатором currentItem.Id, но это не так. Ничего не выбрано, поэтому по умолчанию используется первое.
Это работало до того, как я обновился до RC / RC (обновить). Любые идеи?
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 .
У меня работает следующее (с использованием MVC RC Refresh)
В представлении:
<%= Html.DropDownList("NAME_OF_ITEM_ID_PROPERTY", (SelectList)ViewData["myList"]) %>
Итак, для вашего примера это, вероятно, будет:
<%= Html.DropDownList("Id", (SelectList)ViewData["myList"]) %>
Я просто сделал свой собственный выпадающий помощник. Возможно, не так эффективно, как встроенный, но он работает.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.