Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

DropDownListFor не выбирает значение

Как сделать так, чтобы в DropDownListFor отображалось то значение, которое находится в SelectedStatusId? Сейчас отображается первое по счету в независимости от значения SelectedStatusId
В контроллере
List Statuses = new List(); Statuses.Add(new SelectListItem() { Text = "Passed", Value = "PSS" }); Statuses.Add(new SelectListItem() { Text = "Failed", Value = "FL" }); Statuses.Add(new SelectListItem() { Text = "Blocked", Value = "BLCK" }); Statuses.Add(new SelectListItem() { Text = "Not run", Value = "NR" });
ViewBag.Statuses = new SelectList(Statuses, "Value", "Text");
Во вьюшке
@Html.DropDownListFor( x => x.SelectedStatusId, (SelectList)ViewBag.Statuses, new { @class = "form-control" } )


Ответ

У вас гремучая смесь из нескольких ошибок, которые накладываются друг на друга -- и поэтому вы никак не можете разобраться.
Допустим, у нас есть свой какой-то кастомный статус:
public class MyStatus { public int Id { get; set; } public string Title { get; set; } }
И он обычно может храниться в базе, но мы создадим его вручную и передадим в представление:
public ActionResult Index() { var statuses = new[] { new MyStatus {Id = 1, Title = "New"}, new MyStatus {Id = 2, Title = "Open"}, new MyStatus {Id = 3, Title = "Stopped"}, };
var model = new SomeModel {SelectedStatusId = 2, Statuses = statuses};
return this.View(model); }
(Я очень не люблю передачу через ViewBag и всем рекомендую использовать строго типизованные модели)
Ваша веб-форма будет выглядеть как-то так:
@model MyApp.WebUI.Models.SomeModel @using (Html.BeginForm("", "Home")) {

@Html.DropDownListFor( x => x.SelectedStatusId, Model.Statuses.Select(x => new SelectListItem { Text = x.Title, Value = x.Id.ToString(), Selected = x.Id == Model.SelectedStatusId }), new { @class = "form-control" } )
}
Пример подобран специально именно под вас.
Во-первых, у меня SelectedStatusId -- это честный int и в модели тоже int. У вас SelectedStatusId непонятно что, а в SelectListItem -- строки.
Во-вторых, посмотрите на определение класса SelectListItem -- я заполнил вручную Selected сравнивая значение Model.SelectedStatusId и Id текущего элемента.
Это работает. Это будет первый пример, который я вам хочу показать.
Далее. Вместо того, чтобы вручную работать с SelectListItem, создавая его через лямбды -- вы можете использовать готовый хелпер SelectList. В контроллере ничего не меняю, а представление станет таким:
@using (Html.BeginForm("", "Home")) {
@Html.DropDownListFor( x => x.SelectedStatusId, new SelectList(Model.Statuses, nameof(MyStatus.Id), nameof(MyStatus.Title), Model.SelectedStatusId), new { @class = "form-control" } )
}
Это тоже работает. Мы в SelectList передаём данные, говорим, какие поля читать и говорим, какой элемент выбран.
Обратите внимание. Ваши статусы уже имеют поля Text и Value, совпадающие с тем, что ожидает SelectListItem, я специально подбирал пример, чтобы уйти от этого (это только запутывает).
PS Вы использовали служебный класс фреймворка вместо класса предметной области. SelectListItem - это класс из слоя представления, пусть view сам решает, как отображать.

Комментариев нет:

Отправить комментарий