Странная проблема DropDownListFor / SelectListItem, не устанавливающая значение по умолчанию - PullRequest
2 голосов
/ 12 мая 2011

Я тяну свои волосы сюда.Я использую DropDownListFor HTML помощник в MVC3 с перечислениями, например, так:

@Html.DropDownListFor(model => model.Title, Enum.GetValues(typeof(ICS_Signup_Form.Models.Titles)).Cast<ICS_Signup_Form.Models.Titles>().Select(x => new SelectListItem { Text = x.ToString().ToFriendlyString(), Value = x.ToString() }), new { @class = "styled" })

Мой enum выглядит так: public enum Titles { Mr, Dr, Miss, Mrs, Ms, Other };

Если Model.Title равно «Другое», тогда выпадающий список не выбирает это значение, в HTML нет selected="selected".Я попытался добавить свойство Selected к SelectListItem: Selected = (x.ToString() == Model.Title), и выражение работает нормально, когда я выполняю свой код, как и ожидалось, но выбранное значение всегда равно "Mr" (первое в списке).

Что еще страннее, это прекрасно работает (как и остальные 7 выпадающих списков, которые есть в моем проекте):

@Html.DropDownListFor(model => model.BusinessStatus, Enum.GetValues(typeof(ICS_Signup_Form.Models.BusinessTypes)).Cast<ICS_Signup_Form.Models.BusinessTypes>().Select(x => new SelectListItem { Text = x.ToString().ToFriendlyString(), Value = x.ToString() }), new { @class = "styled" })

С перечислением: public enum BusinessTypes { Charity, Government, Limited, LLP, Partnership, PLC, SoleTrader };

Разница?Нет .. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

tldr; измените имя вашего DropDownList на другое

У меня была такая же проблема (хотя в ASPX-движке, который, как мне кажется, не имеет никакого значения в этом случае),Вот как repro it:

codebehind (примечание «Selected = true» во втором элементе):

List<SelectListItem> teams = new List<SelectListItem>();
teams.Add(new SelectListItem { Text = "Slackers", Selected = false, Value = "0" });
teams.Add(new SelectListItem { Text = "Workers", Selected = true, Value = "1" });
ViewData["teams"] = teams;

код ASPX:

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

Воспроизводится: вы видите, что первый элемент выбирается автоматически, и ни один из элементов не имеет опции "selected" в HTML.Вот сгенерированный HTML, который его воспроизводит:

<select id="team" name="team">
<option value="0">Slackers</option>
<option value="1">Workers</option>
</select>

Решение : Оказывается, некоторые имена элементов приводят к тому, что механизм рендеринга ASPX ведет себя по-разному.В моем случае я просто изменил имя DropDownList с «team» на «defaultteam» - и оно начало работать:

Вот WORKING ASPX код:

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

и вот HTML-код, сгенерированный им:

<select id="defaultteam" name="defaultteam">
<option value="0">Slackers</option>
<option selected="selected" value="1">Workers</option>
</select>
1 голос
/ 12 мая 2011

Странно.Я не могу воспроизвести.Вот мой рабочий код.

Модель:

public enum Titles { Mr, Dr, Miss, Mrs, Ms, Other };

public class MyViewModel
{
    public Titles Title { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Title = Titles.Other
        };
        return View(model);
    }
}

Вид:

@model MyViewModel

@Html.DropDownListFor(
    model => model.Title, 
    Enum.GetValues(typeof(Titles))
        .Cast<Titles>()
        .Select(x => new SelectListItem 
        { 
            Text = x.ToString(), 
            Value = x.ToString() 
        }), 
    new { @class = "styled" }
)

Как и ожидалось, OtherПредварительно выбран:

<select class="styled" id="Title" name="Title">
    <option value="Mr">Mr</option>
    <option value="Dr">Dr</option>
    <option value="Miss">Miss</option>
    <option value="Mrs">Mrs</option>
    <option value="Ms">Ms</option>
    <option selected="selected" value="Other">Other</option>
</select>

Вы также можете найти следующий метод расширения полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...