Html.DropDownListFor не выбирает правильное значение - PullRequest
1 голос
/ 24 декабря 2011

Создание списка выбора (IEnumerable) из XML-файла со странами, использование которого с 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---")

любые идеары?

Ответы [ 2 ]

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

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

0 голосов
/ 24 декабря 2011

Вам нужно передать значение "Страна" в ваш метод, а затем проверить выбранное значение

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---")
...