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

List<string> oo = ViewBag.oox;
    IEnumerable<SelectListItem> obj = new List<SelectListItem>(oo.Select(ch => new SelectListItem { Text = ch, Value = ch }));
    Html.DropDownList("xyz", obj);
    foreach (var item in obj)
    {
        @item.Value
    }
0
Russian Federation 21 Сен 2018 в 04:21

2 ответа

Лучший ответ

Предполагая, что ViewBag.oox содержит список строк, вы должны вызвать метод DropDownList вне блока кода.

Также вам не нужен явный конструктор List<string> ( не причина того, что ваш раскрывающийся список не отображает thougg ). Метод Select возвращает IEnumerable, и вы можете использовать его для вызова вспомогательного метода.

@{
    List<string> oo = ViewBag.oox;
    var obj = oo.Select(ch => new SelectListItem { Text = ch, Value = ch });
}
@Html.DropDownList("xyz", obj)

Метод DropDownList возвращает MvcHtmlString для разметки элемента SELECT. Когда вы вызываете его внутри блока кода, вы нигде не используете вывод метода. Когда вы выполняете вызов за пределами блока кода с префиксом @, razor будет использовать вывод (разметку HTML) и использовать его для визуализации этой конкретной части страницы.

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

@{
    List<string> oo = ViewBag.oox;
    var obj = oo.Select(ch => new SelectListItem { Text = ch, Value = ch });
    MvcHtmlString selectMarkup = Html.DropDownList("xyz", obj);
}
@selectMarkup

В идеале вы должны следовать первому подходу, вызывая метод вне блока кода.

Помните, что если ViewBag.oox возвращает неожиданное значение, ваш код выйдет из строя при вызове метода Select для этого. Так что перед его использованием безопасно выполнить нулевую проверку. Рассмотрите возможность использования строго типизированной модели представления вместо ViewBag / ViewData для передачи этих данных.

1
Shyju 21 Сен 2018 в 01:50

Вы добавляете List<SelectListItem> в другой новый экземпляр List<SelectListItem> в этом коде ниже, это основная причина, по которой элементы не отображаются:

IEnumerable<SelectListItem> obj = new List<SelectListItem>(oo.Select(ch => new SelectListItem { Text = ch, Value = ch }));

Правильный способ - напрямую использовать Select следующим образом:

@{
    List<string> oo = ViewBag.oox;
    List<SelectListItem> obj = oo.Select(ch => new SelectListItem { Text = ch, Value = ch });
}

А затем используйте его в DropDownList или DropDownListFor:

@Html.DropDownList("xyz", obj);

@Html.DropDownListFor(m => m.xyz, obj);
1
Tetsuya Yamamoto 21 Сен 2018 в 01:38