2013-10-07 3 views
1

Я работаю со списком строковых элементов в mvc, который должен быть выбран из выпадающего списка. Выпадающий список имеет обязательную привязку, а значение отлично настроено, но даже если текущий элемент, который повторяется, соответствует элементу в выпадающем списке, он не выбирается заранее, как его значение, может ли кто-нибудь указать мне в правильном направлении ?C# MVC DropDownListFor Список строк

@for (var i = 0; i < Model.StringList.Count; i++) 
    { 
     if (BL.Helpers.StringHelpers.Validate(Model.DisplayStringSegments[i])) 
     { 
      <div id="editor-field"> 
       @Html.DropDownListFor(m => m.StringList[i], Model.PosterOptions, String.Empty, new { }) 
      </div> 
     } 
     else 
     { 
      <div id="editor-label">@Model.StringList[i]</div> 
      @Html.HiddenFor(model => model.StringList[i]) 
     } 
    } 

Так для этого случая, Опция представляет собой список строк, имеющие только одно значение, «Test» -> задавать как текст и ценность;

 PosterOptions.Add(new SelectListItem() { Text = "Test", Value = "Test" }); 

Может кто-нибудь сказать мне, почему нынешний StringList [я] не быть предварительно выбран, даже если он имеет значение «Test»?

+0

Вы абсолютно определенное значение 'StringList [0]' - это «Тест» (чувствителен к регистру)? –

ответ

4

Для всех, кто сталкивается с этим;

мне пришлось «взломать» решение, я сделал это:

Изменение моего ViewModel (в Model.Options)

List<SelectListItem> to a List<string> 

Изменение моего выпадающего списка выбора к следующему, заставляя выбранный стоимость;

  <div id="editor-field"> 
       @{ 
        string currentString = Model.StringList.ElementAt(i).ToString(); 
       } 

       @Html.DropDownListFor(m => m.StringList[i], new SelectList(Model.Options, currentString), String.Empty, new {}) 
      </div> 

Возможно, есть лучший способ, но это работает!

0

Другим способом может быть установка текущего выбранного элемента во время создания списка, например:

PosterOptions.Add(new SelectListItem() { Text = "Test", Value = "Test", Selected = true }); 
+0

Fals, спасибо, что вернулись ко мне. Поскольку эти значения заданы для каждого элемента в списке, но каждый элемент в списке использует тот же Drop Down, это не сработает. Это потому, что мне нужно, чтобы значение, содержащееся в каждом элементе, выбиралось, а не общее значение по умолчанию. – EverythingGeek

+0

Вы можете установить свойство Selected на основе любых условных условий в вашем контроллере.Это необязательно для установки по умолчанию. Вы можете получить значение откуда-нибудь, сравнить с текущим SelectListItem, а затем установить его как выбранный или нет. – Fals

+0

Поскольку это работает со списком строки, я заканчиваю на n элементов, используя тот же самый выпадающий список, с параметрами y в раскрывающемся списке. Каждому из n элементов потребуется другое выбранное значение, основанное на его значении, тогда как параметры y остаются неизменными для каждого элемента. Например, если у меня есть 6 элементов в PosterOptions и 72 элемента в StringList, у меня будет 72 выпадающих списка, каждый из которых будет отличаться от выбранного пункта PosterOptions. Я не хочу создавать несколько списков для Drop Downs – EverythingGeek

0

У меня был тот же вопрос и ответ помог мне. Я не думаю, что это «хак». Поскольку в вашем вопросе вы использовали один и тот же SelectList для всех dropdownlists, поэтому, хотя вы говорите, что не хотите создавать несколько списков для выпадающих списков, я не вижу другого способа, когда у вас есть несколько выпадающих списков, поскольку вам нужно указать различные выбранные значения.

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

@Html.DropDownListFor(m => m.StringList[i], new SelectList(Model.Options, Model.StringList[i]), String.Empty, new {}) 

В вашем примере вам не нужно различать между текстом и значением, но в моем случае это требовалось. Когда это необходимо, это может быть достигнуто путем предоставления имен значений и текстовых полей для SelectList. Например, говорят, что нужно несколько выпадающие со значениями Страна, такие как:

класс Страна:

public class Country 
{ 
    public string Code { get; set; } 
    public string Name { get; set; } 
} 

Модель:

public List<string> CustomerCountryList { get; set; } 
public IEnumerable<Country> CountryList { get; set; } 

и Вид:

@Html.DropDownListFor(m => m.CustomerCountryList[i], new SelectList(Model.CountryList, "Code", "Name", Model.CustomerCountryList[i])) 
Смежные вопросы