2010-01-08 10 views
2

Этот вопрос относится к ASP.NET MVC 2 RC (декабрьское падение). Основная проблема заключается в том, что при создании выпадающего списка с выбранным по умолчанию значением атрибут «selected» либо не отображается в HTML, либо отнесен к неправильной опции.SelectListItem не выбран, даже если явно установлено значение true

Вот код, чтобы показать неправильный вопрос опции:

Вот функция для создания некоторых значений [AttributeService класс]:

public static Dictionary<int, string> MonthOfBirth 
    { 
     get 
     { 
      Dictionary<int, string> months = new Dictionary<int, string>(); 
      for (int i = 0; i <= 11; i++) 
      { 
       months.Add(i, CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]); 
      } 
      return months; 
     } 
    } 

Вот помощник расширения для создания списка SelectListItems:

public static List<SelectListItem> ToSelectList<T>(
     this IEnumerable<T> enumerable, 
     Func<T, string> text, 
     Func<T, int> value, 
     string defaultOption 
     ) 
    { 
     var items = enumerable.Select(x => new SelectListItem 
     { 
      Text = text(x), 
      Value = value(x).ToString(), 
      Selected = false 
     }).ToList(); 

     items.Insert(0, new SelectListItem 
     { 
      Text = defaultOption, 
      Value = "-1", 
      Selected = true 
     }); 

     return items; 
    } 

Этот фрагмент связывает два выше, вместе:

public List<SelectListItem> MonthOfBirthList 
    { 
     get 
     { 
      return AttributeService.MonthOfBirth.OrderBy(x => x.Key).ToSelectList(x => x.Value, x => x.Key, 
               "Month"); 
     } 
    } 

Первые два фрагмента находятся в разных классах, а третий живет в моей модели ViewModel, которую контроллер просто выплевывает на представление. Так, на мой взгляд, я тогда имеем:

<%=Html.DropDownListFor(x=>x.MonthOfBirth, Model.MonthOfBirthList, new { @class = "panel_4_month" })%> 

Обратите внимание, что мой метод расширения добавляет SelectListItem по умолчанию в позиции индекса 0, со значением по умолчанию и Selected = верно. Когда я поставил точку прерывания на контроллере, чтобы увидеть, что модель содержит список, упорядочен правильно, и правильный параметр установлен на выбранный.

HTML, что я на самом деле получить, хотя это:

<select class="panel_4_month" id="MonthOfBirth" name="MonthOfBirth"> 
    <option value="-1">Month</option> 
    <option selected="selected" value="0">January</option> 
    <option value="1">February</option> 
    <option value="2">March</option> 
    etc... 
</select> 

Первичный вопрос, то ли мой код неправильно, или есть ли ошибка в HTML-визуализатора? Я рад загрузить VS28K-решение с примером кода, если этого недостаточно. Благодарю.

+0

HTML выглядит хорошо. Мне не очень помогает, извините. – graphicdivine

ответ

3

Я не могу видеть ваш метод контроллера, но я считаю, что проблема там. Если вы установили следующее в своем контроллере, вы должны увидеть Month Selected.

public ActionResult Edit(string id) 
{ 
    User myModel = UserServiceFactory.GetUser(id); 
    myModel.MonthOfBirth = -1; 
    return View(myModel); 
} 
+1

Aha - Думаю, что я понял, теперь модель ожидает значение по умолчанию, тогда как я предположил, что установка соответствующего selectlistitem для выбранного будет устанавливать выбранный флаг. Большое спасибо! – Reza

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