Как сделать так, чтобы в DropDownListFor отображалось то значение, которое находится в SelectedStatusId? Сейчас отображается первое по счету в независимости от значения SelectedStatusId
В контроллере
List
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"))
{
Пример подобран специально именно под вас.
Во-первых, у меня SelectedStatusId -- это честный int и в модели тоже int. У вас SelectedStatusId непонятно что, а в SelectListItem -- строки.
Во-вторых, посмотрите на определение класса SelectListItem -- я заполнил вручную Selected сравнивая значение Model.SelectedStatusId и Id текущего элемента.
Это работает. Это будет первый пример, который я вам хочу показать.
Далее. Вместо того, чтобы вручную работать с SelectListItem, создавая его через лямбды -- вы можете использовать готовый хелпер SelectList. В контроллере ничего не меняю, а представление станет таким:
@using (Html.BeginForm("", "Home")) {
Это тоже работает. Мы в SelectList передаём данные, говорим, какие поля читать и говорим, какой элемент выбран.
Обратите внимание. Ваши статусы уже имеют поля Text и Value, совпадающие с тем, что ожидает SelectListItem, я специально подбирал пример, чтобы уйти от этого (это только запутывает).
PS Вы использовали служебный класс фреймворка вместо класса предметной области. SelectListItem - это класс из слоя представления, пусть view сам решает, как отображать.
Комментариев нет:
Отправить комментарий