2015-11-12 4 views
-1

У меня есть представление, которое имеет модель, которая является IEnumerable. Я использую хелпер DropDownListFor Html в цикле foreach для вывода выпадающих списков. Но он не устанавливает для выбранного элемента значение true. Код, как указано ниже:ASP.NET MVC DropDownListFor не устанавливает выбранные данные в true в списке

@model IEnumerable<Example> 
@foreach (var item in Model) { 
    @Html.DropDownListFor(modelItem => item.FilePath, (IEnumerable<SelectListItem>)ViewBag.ConfigFiles, string.Empty, null) 
} 

Приведенный выше код выводит элемент выбора Html. Но ни один из параметров не выбран, хотя item.FilePath имеет то же значение, что и один из параметров.

+0

Это имеет смысл. Благодаря @StephenMuecke – Dean

ответ

1

Это несчастливое ограничение использования DropDownListFor() в цикле, и вам нужно создать новый SelectList на каждой итерации. Однако использование цикла foreach для создания элементов управления формой не будет работать. Его создание дубликатов атрибутов name, которые не имеют отношения к вашей модели, поэтому не будет связывать, а также генерировать повторяющиеся атрибуты id, которые являются недопустимыми html.

Изменить модель для IList<T> и использовать for цикл и генерировать в каждой итерации новый SelectList с помощью конструктора, который устанавливает selectedValue

@model IList<Example> 
.... 
@for(int i = 0; i < Model.Count; i++) 
{ 
    @Html.DropDownListFor(m => m[i].FilePath, new SelectList(ViewBag.ConfigFiles, "Value", "Text", Model[i].FilePath), string.Empty, null) 
} 

Обратите внимание, что это сейчас генерировать name атрибуты, который связывается с моделью

<select name="[0].FilePath">....<select> 
<select name="[1].FilePath">....<select> 
.... etc 

Обратите внимание, что в контроллере не требуется создавать IEnumerable<SelectListItem>. Вы вместо того, чтобы можно было назначить коллекцию своих объектов ViewBag

ViewBag.ConfigFiles = db.ConfigFiles; 

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

new SelectList(ViewBag.ConfigFiles, "ID", "Name") // adjust 2nd and 3rd parameters to suit your property names