2015-11-19 2 views
0

Я пытаюсь заполнить DropDownListFor, на мой взгляд, но мне кажется, что он не работает.Заполнение DropDownListFor с начальным значением

My Model

public class Warehouse 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
    public string LocationCode { get; set; } 
    public IEnumerable<SelectListItem> LocationList 
    { 
     get 
     { 
      DbEntities db = new DbEntities(); 

      var List = new SelectList(db.Locations, "LocID".Trim(), "Desc".Trim()); 
      return List; 
     } 
     set { } 
    } 
} 

В моей ViewPage У меня есть следующий код

@model IEnumerable<MyApp.Models.Warehouse> 

<!-- some html --> 
@foreach(var s in Model) 
{ 
    @Html.DropDownListFor(p => s.LocationCode, s.LocationList, "", new { @class = "form-control" }) 
} 

Я думал, установив p => s.LocationCode я установить начальное значение выбранного для DropDownList (выбранное значение должно быть пустым, если s.LocationCode == null), но мой результат состоит в том, что все выпадающие окна имеют начальное пустое значение (и когда я нажимаю на один из них, вы видите, что выпадающий список заполнен).

+0

Есть слишком много аналогичный вопрос в SO. Посмотрите на это, например: http://stackoverflow.com/questions/16034454/create-many-dropdownlistfor-in-foreach-loop – ataravati

ответ

0

Во-первых, это не будет связываться, когда вы отправляете. Вы не можете создавать элементы управления формой в foreach цикла, поскольку она создает дубликат name атрибутов, которые не имеют никакого отношения к вашей модели (это также недопустимые HTML из-за повторяющиеся id атрибутов. Если вы осмотрите HTML вы увидите, что его

<select name="s.LocationCode" ... > 
<select name="s.LocationCode" ... > 

, где, как это должно быть

<select name="[0].LocationCode" ... > 
<select name="[1].LocationCode" ... > 

Ваш цикл должен быть

@model List<MyApp.Models.Warehouse> // must implement IList<T> 
.... 
@for(int i = 0; i < Model.Count; i++) 
{ 
    @Html.DropDownListFor(m => m[i].LocationCode, Model[i].LocationList, ...) 

Другой альтернативой является использование пользовательских EditorTemplate для TYPEOF Warehouse

В /Views/Shared/EditorTemplates/Warehouse.cshtml

@model Warehouse 
.... 
@Html.DropDownListFor(m => m.LocationCode, Model.LocationList, ...) 

, а затем в главном окне

@model IEnumerable<MyApp.Models.Warehouse> // can be Enumerable<T> 
.... 
@Html.EditorFor(m => m) 
+0

Я пробовал то, что вы описываете выше, но тогда я не могу использовать SelectList (Model.LocationList, потому что он говорит, что моя модель не содержит определения. – kwv84

+0

К сожалению - я только что понял, что ваш SelectList действительно находится внутри модели (необычно), поэтому в этом случае это должно быть просто '@ Html.DropDownListFor (m = > m [i] .LocationCode, Model [i] .LocationList) '- генерация нового' SelectList' не является строго необходимой. Основная проблема заключается в неправильном использовании цикла 'foreach', который не даст привязки двухсторонней модели –

+0

Я бы также подумал об изменении способа, которым вы это делаете. Доступ к базе данных в подобной модели не является хорошей практикой. Делает невозможным единичный тест, если вы не вводите его, используя DI –

Смежные вопросы