Выбранное значение не выбрано в DropDownListFor из SelectList из SelectListItems

DropDownListFor не выбирает SelectListItem, который я указываю, должен быть выбран. Невозможно понять, почему, поскольку все параметры кажутся правильными.

Модель представления:

public class SchemesViewModel
{
    public int SchemeId { get; set; }
    public SelectList Schemes { get; set; }
}

Контролер (подготовка списка выбора):

var schemes = schemeManager.GetUserSchemes(this.UserId);

var selectListItems = schemes.Select(x => new SelectListItem() { Value = x.Id.ToString(), Text = x.Name, Selected = (x.Id == 2) });

var vm = new UserSchemesViewModel()
{
     Schemes = new SelectList(selectListItems, "Value", "Text", selectedValue: selectListItems.FirstOrDefault(x => x.Selected == true).Value)
};

return PartialView("_UserSchemes", vm);

Просмотр:

Примечание. Здесь опция выбора со значением 2 не выбрана!

 @Html.DropDownListFor(x => x.SchemeId, Model.Schemes)

person Tomuke    schedule 27.01.2016    source источник


Ответы (1)


Установка свойства Selected для SelectListItem игнорируется методом DropDownListFor(). Внутри метод создает новый IEnumerable<SelectListItem>, используя Value из Text свойств существующего SelectList, и устанавливает новое свойство Selected на основе значения свойства, к которому вы привязываетесь. Вам нужно установить значение SchemeId перед передачей модели в представление.

Также нет смысла создавать второй идентичный SelectList из первого (это просто ненужные дополнительные накладные расходы).

Измените свой код на

public class SchemesViewModel
{
    public int SchemeId { get; set; }
    public IEnumerable<SelectListItem> Schemes { get; set; }
}

Контроллер

var schemes = schemeManager.GetUserSchemes(this.UserId);
var selectListItems = schemes.Select(x => new SelectListItem()
{
    Value = x.Id.ToString(), 
    Text = x.Name
});
var vm = new UserSchemesViewModel()
{
    Schemes = selectListItems,
    SchemeId = 2
};
return PartialView("_UserSchemes", vm);

Теперь, если один из ваших параметров имеет значение value="2", этот параметр будет выбран при первом отображении вида.

person Community    schedule 27.01.2016