ASP.Net MVC SelectList не «выбирает» правильный элемент - PullRequest
2 голосов
/ 15 июня 2011

Меня попросили посмотреть на ошибку в некотором коде ASP.Net MVC и возникла (для меня) очень странная проблема с SelectList.

Код из контроллера для генерации элементов (aспособ вернуть SelectList, всего их 5).Каждый список SelectList затем сохраняется в коллекции ViewData.

List<SelectListItem> items = new List<SelectListItem>();
string yesText = "Yes";
string noText = "No";
if (ci.LCID.Equals((int)LanguageCodes.FRANCE))
{
    yesText = "Oui";
    noText = "Non";
}

SelectListItem yesItem = new SelectListItem();
yesItem.Text = yesText;
yesItem.Value = ((int)MarketingBy.Yes).ToString();
yesItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(yesItem.Value));

SelectListItem noItem = new SelectListItem();
noItem.Text = noText;
noItem.Value = ((int)MarketingBy.No).ToString();
noItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(noItem.Value));

items.Add(yesItem);
items.Add(noItem);

return new SelectList(items, "Value", "Text", yesItem.Selected ? yesItem.Value : noItem.Value);

Быстрый «быстрый просмотр» в точке создания предполагает, что все в порядке: Выбор созданного списка http://i52.tinypic.com/x3hd3r.png

В точкепредставление отображается, значения по-прежнему выглядят нормально.Однако при загрузке представления первый элемент в списке выбирается всегда .Сгенерированный HTML-код:

<tr>
<td>Fax</td>
<td>
    <select id="MarketingByFax" name="MarketingByFax">
        <option value="134300002">Yes</option>
        <option value="134300001">No</option>
    </select>
</td>
</tr>

(другие значения для ясности опущены).

Есть идеи?Или возможности для исследований?Автор непреклонен, что это работало "до последней недели" (я понятия не имею, в любом случае).

Редактировать: Код для представления -

<td><%: Html.DropDownList("MarketingByFax", (SelectList)ViewData["MarketingByFaxList"])%></td>

Ответы [ 2 ]

6 голосов
/ 15 июня 2011

Этот код выглядит просто ужасно во всех мыслимых аспектах (ИМХО конечно). Я понятия не имею, почему это не работает, и я не хочу знать. Все, что я могу сделать, - это предложить вам, как его улучшить (так что вы можете прекратить читать этот пост, если вы ищете решение о том, почему ваш код не работает, так как я не имею ни малейшего представления).

Итак, первым улучшением было бы избавиться от любого ViewData и ввести модель представления:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

тогда у меня будет действие контроллера, которое заполняет эту модель представления:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        // I want to preselect the second value
        SelectedValue = "No",
        Items = new[]
        {
            new SelectListItem { Value = "Yes", Text = "yeap !" },
            new SelectListItem { Value = "No", Text = "nope !" },
        }
    };
    return View(model);
}

и в моем строго типизированном представлении я просто привязал бы помощника к модели представления:

<%= Html.DropDownListFor(
    x => x.SelectedValue,
    new SelectList(Model.Items, "Value", "Text")
) %>

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

Видите, как это просто? Нет больше уродливых приведений с ViewData, больше не нужно определять какие-либо списки и указывать некоторые сложные условия, ...

Примечание: еще раз, это только мои 2 ¢, вы можете продолжить бой с ViewData, если хотите.

0 голосов
/ 15 июня 2011

вы можете попробовать

<%: Html.DropDownList("MarketingByFax", (IEnumerable<SelectListItem>)ViewData["MarketingByFaxList"])%>

У dropdwon есть перегрузка, которая принимает перечисление объектов типа Selectlist и автоматически устанавливает значение списка в зависимости от свойства Selected объекта selectListItems в списке.для этого вы должны установить

ViewData["MarketingByFaxList"] = items;//where item is IEnumerable<SelectListItem> or List<SelectListItem> as you used in your code
...