DropDownListFor не выбирает значение, если в течение цикла - PullRequest
24 голосов
/ 13 апреля 2010

На мой взгляд

<%= Html.DropDownListFor( x => x.Countries[ i ], Model.CountryList )%>

в моем контроллере

public int[ ] Countries { get; set; }

public List<SelectListItem> CountryList { get; set; }

Когда формы публикуются, проблем не возникает, заполняется выпадающий список и публикуются значения, выбранные пользователем. Но когда я пытаюсь загрузить форму с уже присвоенными значениями в Страны [], она не выбирается.

Ответы [ 6 ]

24 голосов
/ 09 апреля 2013

Не уверен, является ли это новинкой для mv4 или существует в предыдущей версии.Но DropDownListFor включает дополнительный параметр для конструктора SelectList.

SelectList(IEnumerable, String, String, Object)

Например:

Html.DropDownListFor( x => x.Countries[ i ], New SelectList(Model.CountryList,"ID","Description",Model.Countries[i]))

Где ID - идентификатор страны в объекте CountryList и Description это название страны.

10 голосов
/ 01 марта 2011

Я тоже получаю. При использовании foreach для обхода DropDownListFor (т. Е. Для отображения нескольких выбранных элементов на странице).

Мой обходной путь - установить выбранное значение в контроллере, а не в представлении: что-то вроде этого:

В контроллере:

public class FruitList 
{        
    public int? selectedFruit{ get; set; }
    public List<SelectListItem> fruits
    {
        get
        {
            fruitEntities F = new fruitEntities();
            List<SelectListItem> list = (from o in F.Options
                                         select new SelectListItem
                                         {
                                             Value = o.fruitID,
                                             Text = o.fruit,                                                 
                                             Selected = o.fruitID == selectedFruit
                                         }).ToList();
            return list;
        }
    }
}

public class ViewModel 
{              
    public List<FruitList> collectionOfFruitLists { get; set; }        
}

В поле зрения

<table>                        
   <% for (int i=0; i < Model.collectionOfFruitLists.Count; i++ )
        { %>
        <tr>                            
            <td><%: Html.DropDownList("fruitSelectList", collectionOfFruitLists[i].fruits, "Please select...") %></td>                
        </tr>
        <%} %>
 </table>

Отличный бит Selected = o.fruitID == selectedFruit в контроллере, который действует как оператор SQL CASE; это действительно хорошо объясняется Лансом Фишером (спасибо, Ланс, ваш пост действительно помог мне:)

6 голосов
/ 30 августа 2016

Я знаю, что этот вопрос немного устарел, но я только что столкнулся с этой проблемой, просматривая список объектов и пытаясь привязать значения к DropDownListFor (s) в моем представлении редактирования.

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

Привязка к моей модели:

@Html.DropDownListFor(model => model.QuestionActions[i].QuestionActionTypeId,
      Model.QuestionActionTypes.Select(x => new SelectListItem() { Value = x.Value, Text = x.Text, Selected = (x.Value == Model.QuestionActions[i].QuestionActionTypeId.ToString()) }).ToList(),
          "Select Action Type",
                 new { })

Model.QuestionActionTypes - это список SelectList, который заполняется в моем контроллере.

0 голосов
/ 09 марта 2017

Вместо использования IEnumerable в вашей модели представления используйте список объектов, подобных этому:

public List<PairVM<string,string>> TiposValorCobertura { get; private set; }

И в вашем представлении, когда вы назначаете выбираемые элементы для выпадающего списка в цикле, делайте это следующим образом:

@Html.DropDownListFor(m => m.Coberturas[i].TipoLimiteInferior, new SelectList(Model.TiposValorCobertura,"Key","Description",  Model.Coberturas[i].TipoLimiteIferior))

Где «Ключ» и «Описание» - это свойства PairVM

0 голосов
/ 11 января 2012

Это что-то вроде хака, и он зависит от JavaScript, но он работал очень хорошо для меня.

Вам необходимо знать идентификаторы клиентов, которые будут создаваться полями (обычно они могут быть разработаны вручную, но в целях безопасности вы можете использовать что-то вроде FieldIDFor метод .

Вам просто нужно установить значения, основанные на модели, в jQuery's $ (document) .ready:

<script type="text/javascript">
    $(document).ready(function () {
        @for(var i = 0; i < 5; i++)
        {
            <text>
                $("#@Html.FieldIDFor(m => m.Countries[i])").val("@Model.Countries[i]");
            </text>
        }
    });
</script>
0 голосов
/ 13 апреля 2010

Поле выбора отправляет одно значение, поэтому свойство Countries не должно быть массивом. Также в вашем посте неясно, откуда взялась переменная i, которую вы используете в лямбда-выражении, и этот x.CountryList, используемый в помощнике, не скомпилируется, так как x не определен.

Модель:

public class MyModel
{
    public int SelectedCountry { get; set; }
    public List<SelectListItem> CountryList { get; set; }
}

Вид:

<%= Html.DropDownListFor(x => x.SelectedCountry, Model.CountryList) %>

UPDATE:

Согласно комментарию, кажется, что есть несколько выпадающих списков. Я подозреваю, что проблема может быть вызвана переменной i, используемой в качестве индекса в цикле for.

Вы можете попробовать это вместо:

Модель:

public class MyModel
{
    public int[] Countries { get; set; }
    public List<SelectListItem> CountryList { get; set; }
}

Вид:

<% foreach (var country in Model.Countries) { %>
    <%= Html.DropDownListFor(x => country, Model.CountryList) %>
<% } %>
...