К сожалению, @Html.DropDownListFor()
ведет себя несколько иначе, чем другие помощники при рендеринге элементов управления в цикле. Об этом ранее сообщалось как о проблеме с CodePlex (не уверен, что ее ошибка или просто ограничение)
. Это 2 варианта для решения этой проблемы, чтобы обеспечить выбор правильной опции на основе свойства модели
Вариант 1 (с использованием EditorTemplate
)
Создайте пользовательский EditorTemplate
для типа в коллекции. Создайте парциальное значение в /Views/Shared/EditorTemplates/AggregationLevelConfiguration.cshtml
(обратите внимание, что имя должно соответствовать имени типа
@model yourAssembly.AggregationLevelConfiguration
@Html.DropDownListFor(m => m.HelperCodeType, (SelectList)ViewData["CodeTypeItems"])
.... // other properties of AggregationLevelConfiguration
, а затем в главном представлении передать SelectList
в EditorTemplate
как additionalViewData
@using (Html.BeginForm())
{
...
@Html.EditorFor(m => m.Configurations , new { CodeTypeItems = Model.CodeTypeItems })
...
Вариант 2 (сгенерируйте новую SelectList
на каждой итерации и установите selectedValue
)
В этом параметре ваше свойство CodeTypeItems
должно быть IEnumerable<GenericIdNameType>
, а не SelectList
(или просто сделать codeTypes
общедоступным свойством). Затем в главном представлении
@Html.DropDownListFor(m => m.Configurations[0].HelperCodeType, new SelectList(Model.CodeTypeItems, "Id", "Name", Model.Configurations[0].HelperCodeType)
Сторона примечания: нет необходимости использовать new { id = "Configurations[0].HelperCodeType"
- метод DropDownListFor()
уже сгенерированный атрибут id
Это происходит из-за "дизайном" природа DataReaders. Любые параметры отмечены как ParameterDirection.Output
не будет "заполнено", пока DataReader не был закрыт. В то время как все еще открытый, все Выходные параметры больше, чем, вероятно, просто возвратятся null
.
Полная статья Microsoft KB относительно этого может быть просмотрена здесь.