Невозможно преобразовать тип 'System.Collections.Generic.List <string>' в 'System.Web.Mvc.SelectList'

У меня есть следующий метод действий, у которого есть viewBag со списком строк: -

public ActionResult Login(string returnUrl)
        {
            List<string> domains = new List<string>();
    domains.Add("DomainA");

            ViewBag.ReturnUrl = returnUrl;
            ViewBag.Domains = domains;
            return View();
        }

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

@Html.DropDownList("domains",(SelectList)ViewBag.domains )

Но я получил следующую ошибку: -

Невозможно преобразовать тип 'System.Collections.Generic.List' в 'System.Web.Mvc.SelectList'

Так может ли кто-нибудь сообразить, почему я не могу заполнить список DropDown списка укусов? Благодаря

Ответ 1

Потому что DropDownList не принимает список строк. Он принимает IEnumerable<SelectListItem>. Это ваша обязанность конвертировать в ваш список строк. Это достаточно легко, хотя:

domains.Select(m => new SelectListItem { Text = m, Value = m })

Затем вы можете передать это DropDownList:

@Html.DropDownList("domains", ((List<string>)ViewBag.domains).Select(m => new SelectListItem { Text = m, Value = m }))

Ответ 2

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

    public ActionResult Login(string returnUrl)
    {
        List<string> domains = new List<string>();
        domains.Add("DomainA");

        ViewModel model=new ViewModel();
        miewModel.ReturnUrl = returnUrl;
        miewModel.Domains =new SelectList(domains);
        return View(model);
    }

    Public Class ViewModel()
    {
        property Url ReturnUrl{get;set;}
        property SelectList Domains{get;set;}
    }

Ответ 3

Чтобы завершить ответ Криса Пратта, вот пример кода для создания раскрывающегося списка:

@Html.DropDownList("domains", new SelectList(((List<string>)ViewBag.domains).Select(d => new SelectListItem { Text = d, Value = d }), "Value", "Text"))

Что будет производить следующая разметка:

<select id="domains" name="domains">
    <option value="item 1">item 1</option>
    <option value="item 2">item 2</option>
    <option value="item 3">item 3</option>
</select>

Ответ 4

@Html.DropDownListFor(
     m => m.Country, 
          new SelectList(_CountryList, "CountryID", "Title"),
          new { @class = "form-control" }
)