2011-12-29 3 views
2

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

@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 для статуса, тогда, когда я смотрю на экран, я вижу список выбора со словом «Release».

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

+1

Какой тип имеет свойство вашей модели 'Model.AdminSummaries [index] .Status'? Если его тип перечисления, попробуйте изменить его на 'int'. – Jan

+0

public string Status {get; задавать; } –

+0

public string Status {get; задавать; } - я изменился на int, но все еще не работает. –

ответ

1

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

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; 
    } 
} 
+0

Извините, но я ничего не понимаю о том, что вы говорите. Класс, который вы хотите изменить, содержит справочные данные. Почему я должен менять этот класс? Я хочу сказать, что при отображении представления DropDownListFor не соответствует фактическому элементу данных в списке выбора. –

1

Установите 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" } 
      }; 
    } 

} 
+0

Извините, но что вы говорите? Для меня это вообще не имеет смысла. –

+0

@Melissa, я говорю, что когда вы создаете экземпляр 'SelectListItem', который вы хотите выбрать изначально, вам просто нужно инициализировать свойство' Selected' до 'true'. Имеет ли это смысл? –

+0

Прошу прощения, но ваш ответ вообще не имеет смысла. –

1

швы из исходного кода, что 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; 
} 
+0

Мое решение состояло в том, чтобы переопределить 'DropDownListFor', который использовал' ModelMetadata' и 'ExpressionHelper' вместо' Eval' - еще в 2013 году для MVC 2.0. Сейчас 2016 год, и последние выпуски ASP.NET MVC по-прежнему имеют эту проблему. – Dai

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