Html.DropDownList Выбранное значение не работает (с помощью конструктора с IEnumerable <SelectListItem>)

У меня проблема, когда выбранное значение не работает для вспомогательного метода Html.DropDownList. См. Ниже:

Это мой контроллер:

public ActionResult Edit(int id = 0)
{
    NewsEvent item = GetItem(id);
    ViewBag.NewsItemId = new SelectList(ViewBag.NewsItemId.Items, "Id", "Name", item.NewsItemId);

    return View(item);
}

Это мой вид:

@Html.DropDownList("NewsItemId",ViewBag.NewsItemId as SelectList, string.Empty,
                           new { @class = "form-control" })

Однако, когда я пытаюсь сделать это ниже, он работает:

@Html.DropDownList("NewsItemId", string.Empty)

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

@Html.DropDownList("NewsItemIdDrop",ViewBag.NewsItemId as SelectList, string.Empty,
                           new { @class = "form-control" })

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

Может кто-нибудь помочь мне понять, что я делаю неправильно?

Ответы

Ответ 1

У вас такая же проблема:

DropDownListДля выбора значения

Проблема заключается в вашем имени свойства ViewBag. Потому что это то же самое, что и ваше свойство в модели, это не сработает. Вы должны просто изменить имя своего средства просмотра ViewBag на что-то еще, например:

ViewBag.NewsItemList = new SelectList(ViewBag.NewsItemId.Items, "Id", "Name", item.NewsItemId);

и на представлении

@Html.DropDownList("NewsItemId",ViewBag.NewsItemList as SelectList, string.Empty,
                           new { @class = "form-control" })

Ответ 2

Я пробовал много вещей, но в итоге получил это, как это.

В контроллере

int valittu_tila = 1;
var tapahtumantilat = new List<SelectListItem>();

tapahtumantilat.Add(new SelectListItem { Text = "Tapahtumaa kirjataan", Value = "0" });
tapahtumantilat.Add(new SelectListItem { Text = "Odottaa jonossa", Value = "1"});
tapahtumantilat.Add(new SelectListItem { Text = "Tapahtumaa käsitellään", Value = "2"});

ViewBag.tilalista = new SelectList(tapahtumantilat, "Value", "Text", valittu_tila);

А потом я просто положил (у меня тоже есть событие onchange и класс для выпадающего списка, но вы можете удалить их, если хотите).

@Html.DropDownList("tuki_tila", ViewBag.tilalista as SelectList, "-- valitse tila --", new { @onchange = "executeticketsearch();", @class = "haku_dropdowns" })

(Извините за финские значения текста и имена переменных, но это не имеет значения: D)

Ответ 3

Мне не понравилось, что вы можете использовать

@Html.DropDownList("NewsItemID") 

и он работает. Затем вам нужно добавить атрибут "class", и он внезапно сломается. Я видел одно рабочее место, а другое не работало с использованием синтаксиса

@Html.DropDownList("NewsItemId",ViewBag.NewsItemId as SelectList, string.Empty,
                       new { @class = "form-control" })

Когда я исследовал это, я определил, что ViewBag.NewsItemId на самом деле является нулевым в представлении. Поэтому рабочий синтаксис с полями Model и ViewBag с таким же именем

@Html.DropDownList("NewsItemId", null, string.Empty,
                       new { @class = "form-control" })

Ответ 4

Прежде всего, как вы заполняете ViewBag.NewsItemId.Items? Мы не видим, откуда взялись значения.

Чтобы сделать выбранное значение, оно должно быть того же типа, что и элементы ваших коллекций. Если item.NewsItemId имеет тип T, ViewBag.NewsItemId.Items должен иметь тип IEnumerable<T> (или любой другой тип коллекции, реализующий его). Кажется, это не так, потому что вы устанавливаете NewsItemId в качестве выбранного значения, в то время как ваша коллекция основана на NewsItemId.Items, которая может быть не одного типа.

Ответ 5

Вы должны изменить само название поля DropDownList:

@Html.DropDownList("Some_Name_that_does_not_exist_in_model", ViewBag.NewsItemId as SelectList, string.Empty, new { @class = "form-control" })

Ответ 6

изменить имя свойства viewbag на другое имя модели, используемое на странице.

Ответ 7

@Html.DropDownList("NewsItemId",ViewBag.NewsItemId as SelectList, string.Empty,
    new { @class = "form-control" })

измените на

@Html.DropDownList("NewsItemId", ViewBag.NewsItemIdList as SelectList, string.Empty, 
    new { @class = "form-control" })

ViewBag.NewsItemIdList имя изменено. также изменение в контроллере.

Ответ 8

У меня такая же проблема. В приведенном ниже примере переменная ViewData ["DATA_ACREDITO_MODELO_INTEGRADO"] имеет список SelectListItem с выбранным значением по умолчанию, но такой атрибут не отображается визуально.

// data 
        var p_estadoAcreditacion = "NO";
        var estadoAcreditacion = new List<SelectListItem>();
        estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)"    , Value = " "    });
        estadoAcreditacion.Add(new SelectListItem { Text = "SI"              , Value = "SI"   });
        estadoAcreditacion.Add(new SelectListItem { Text = "NO"              , Value = "NO"   });

        if (!string.IsNullOrEmpty(p_estadoAcreditacion))
        {
            estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

Я решил это, сделав первый аргумент DropdownList, отличный от атрибута id.

// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id         = "SELECT__ACREDITO_MODELO_INTEGRADO"
...