Выбранный элемент не отображается, когда я использую DropDownListFor - PullRequest
2 голосов
/ 29 декабря 2011

Я использую следующее для создания выпадающего списка:

@for (var index = 0; index < Model.AdminSummaries.Count(); index++) 
            { 
            <div class="rep_tr0"> 
                <div class="rep_td0"> 
                    @Html.DropDownListFor(x => Model.AdminSummaries[index].Status, 
                       AdminStatusReference.GetAdminStatusOptions(),
                       new { id = string.Format("Status_{0}",index ) })
                 </div> 
            </div>
            }

Вот HTML-код, который он генерирует:

<select id="Status_1" name="AdminSummaries[1].Status"><option value="1">Released</option>
<option value="2">Review</option>
<option value="3">New</option>
</select>

Вот класс, который дает параметры статуса.

public static class AdminStatusReference
{

    public static IEnumerable<SelectListItem> GetAdminStatusOptions()
    {
        return new[]
            {
                new SelectListItem { Value = "1", Text = "Released"  },
                new SelectListItem { Value = "2", Text = "Review" },
                new SelectListItem { Value = "3", Text = "New" }
            };
    }

}

Все работает хорошо, КРОМЕ этого не выбирает элементы правильно. Нет никакой опции с 'selected', чтобы соответствовать данным в AdminSummaries.

Как сделать так, чтобы были выбраны правильные элементы списка выбора?

Просто чтобы прояснить это. Моя проблема в том, что если для состояния есть запись данных со значением 3, то, когда я смотрю на экран, я вижу список выбора со словом «Выпуск».

Мне нужно, чтобы в списке выбора отображался текст, соответствующий значению данных.

Ответы [ 3 ]

1 голос
/ 29 декабря 2011

Вот более точный ответ

public static class AdminStatusReference 
{ 
    public static IEnumerable<SelectListItem> GetAdminStatusOptionsFor(AdminSummaries arg) 
    { 
        var options = new[] 
            { 
                new SelectListItem { Value = "1", Text = "Released" }, 
                new SelectListItem { Value = "2", Text = "Review" }, 
                new SelectListItem { Value = "3", Text = "New" } 
            }; 
        options.First(o=> o.Value == arg).Selected = true;
        return options; 
    } 
} 
1 голос
/ 29 декабря 2011

Из исходного кода видно, что метод DropDownListFor (фактически метод ViewDataEvaluator.Eval) не поддерживает выражения, содержащие индексаторы.Поскольку ваше выражение: AdminSummaries[index].Status содержит индексатор, поэтому платформа не использует выбранное значение из класса вашей модели.
Единственное решение - указать выбранный элемент при настройке коллекции SelectListItem, вы можете сделать этопередав текущее выбранное значение в метод GetAdminStatusOptions:

Просмотр:

@Html.DropDownListFor(x => Model.AdminSummaries[index].Status,
    AdminStatusReference.GetAdminStatusOptions(Model.AdminSummaries[index].Status),
    new { id = string.Format("Status_{0}",index ) })  

Пример реализации GetAdminStatusOptions:

public static IEnumerable<SelectListItem> GetAdminStatusOptions(string selected = null)
{
    var options = new[]
                      {
                          new SelectListItem {Value = "1", Text = "Released"},
                          new SelectListItem {Value = "2", Text = "Review"},
                          new SelectListItem {Value = "3", Text = "New"}
                      };
    foreach (var option in options)
    {
        option.Selected = option.Value == selected;
    }
    return options;
}
1 голос
/ 29 декабря 2011

Установите для свойства SelectListItem.Selected значение true:

public static class AdminStatusReference 
{ 

    public static IEnumerable<SelectListItem> GetAdminStatusOptions() 
    { 
        return new[] 
            { 
                new SelectListItem { Value = "1", Text = "Released", Selected = true  }, 
                new SelectListItem { Value = "2", Text = "Review" }, 
                new SelectListItem { Value = "3", Text = "New" } 
            }; 
    } 

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...