2011-12-24 3 views
1

Создание выборочного списка (IEnumerable) из XML-файла со странами, используя это с DropDownListFor, не устанавливает выбранное значение, указанное в модели?Html.DropDownListFor не выбирает правильное значение

public static IEnumerable<SelectListItem> CountrySelectList() 
    { 
     var sRetVal = new List<SelectListItem>(); 
     string CachKey = "MVCXMLCountryList" + GetCulture(); 
     if (HttpContext.Current.Cache[CachKey] == null | 1 == 1) 
     { 
      string xmlFile = Path.Combine(HttpContext.Current.Server.MapPath("~"),  "Countries.xml"); 

      XmlDocument Doc = new XmlDocument(); 
      Doc.Load(xmlFile); 
      foreach (XmlNode Node in Doc.SelectNodes(String.Format("//Countries/language[@iso=\"{0}\"]/country", GetCulture()))) 
      { 
       var tmpSelect = new SelectListItem(); 
       tmpSelect.Value = Node.Attributes["iso2"].InnerText.ToString(); 
       tmpSelect.Text = Node.Attributes["name"].InnerText; 
       tmpSelect.Selected = false; 
       sRetVal.Add(tmpSelect); 
      } 
      sRetVal.Sort(CountrySort); 
      var prioritet = new string[] {"de","fo","se","no","dk"}; 
      switch (GetCulture()) 
      { 
       case "dk": prioritet = new string[] {"de","fo","se","no","dk"}; break; 
       default: prioritet = new string[] { "de", "se", "no", "dk", "gb" }; break; 
      } 

       foreach (string Country in (string[])prioritet) 
       { 
        selectedCountry = Country; 
        var tmpSel = sRetVal.Find(FindCurrentSelected); 
        sRetVal.RemoveAt(sRetVal.FindIndex(FindCurrentSelected)); 
        sRetVal.Insert(0, tmpSel); 
       } 
       //sRetVal[10].Selected = true; 
      HttpContext.Current.Cache[CachKey] = sRetVal; 
     } 
     else 
     { 
      sRetVal = (List<SelectListItem>)HttpContext.Current.Cache[CachKey]; 
     } 
     return (IEnumerable<SelectListItem>) sRetVal; 
    } 

Пытались как:

@Html.DropDownListFor(model => model.Country, new SelectList(CommonHelpers.CountrySelectList(), "Value", "Text", Model.Country), "---Select---") 

и

@Html.DropDownListFor(model => model.Country, CommonHelpers.CountrySelectList(), "---Select---") 

любые idears?

ответ

1

Свойство модели (Страна) и явно передается в SelectList должны иметь разные имена, чтобы подключить выбранный элемент. Когда не выбрано выделенного значения, браузеру по умолчанию присваивается первый элемент в SelectList. Это известное ограничение помощника DropDownList. Я заканчиваю учебник DDL. Вы можете получить заполненный код на http://code.msdn.microsoft.com/Using-the-DropDownList-67f9367d Стреляйте мне по электронной почте, и я пришлю вам учебник.Rick.Anderson [at] microsoft.com

+0

Thx. Посмотрите ссылку, но не можете увидеть, где мой код не работает. Имейте tride для поставки SleectList (с SELECTED set) с контроллера, но он все еще dosn'et работает? – DTA

0

Вам необходимо пройти «Страна» значение вашего метода затем проверить выбранное значение

public static IEnumerable<SelectListItem> CountrySelectList(string countryId) 
{ 
    var sRetVal = new List<SelectListItem>(); 
    // .......................   
    foreach (XmlNode Node in Doc.SelectNodes(String.Format("//Countries/language[@iso=\"{0}\"]/country", GetCulture()))) 
    { 
     var tmpSelect = new SelectListItem(); 
     tmpSelect.Value = Node.Attributes["iso2"].InnerText.ToString(); 
     tmpSelect.Text = Node.Attributes["name"].InnerText; 
     // Check for selected value 
     tmpSelect.Selected = string.Equals(tmpSelect.Value, countryId); 
     sRetVal.Add(tmpSelect); 
    } 
    //................... 
    return (IEnumerable<SelectListItem>)sRetVal; 
} 

Или просто сделать новый помощник сделать это для вас. Что-то вроде этого:

public static IEnumerable<SelectListItem> SetSelected(this IEnumerable<SelectListItem> selectList, string selectedValue) 
{ 
    var newList = new List<SelectListItem>(); 
    var oldList = selectList.ToList(); 
    for (var i = 0; i < oldList.Count; i++) 
    { 
     var item = oldList[i]; 
     item.Selected = string.Equals(item.Value, selectedValue, StringComparison.CurrentCultureIgnoreCase); 
     newList.Insert(i, item); 
    } 
    return newList; 
} 

А вот использование:

@Html.DropDownListFor(model => model.Country, CommonHelpers.CountrySelectList().SetSelected(model.Country), "---Select---") 
+0

Thx для ответа! Попробовали установить SELECTED в SelectList, но это не помогает (Не важно, как это сделать)? Необходимо понять ответ ниже, чтобы узнать, есть ли ответ. – DTA

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