Нет элемента ViewData типа "IEnumerable <SelectListItem>", который имеет ключевую страну

Во время привязки выпадающего меню в MVC я всегда получаю эту ошибку: There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key country.

Просмотр

@Html.DropDownList("country", (IEnumerable<SelectListItem>)ViewBag.countrydrop,"Select country")

контроллер

List<Companyregister> coun = new List<Companyregister>();
coun = ds.getcountry();

List<SelectListItem> item8 = new List<SelectListItem>();
foreach( var c in coun )
{
    item8.Add(new SelectListItem
    {
        Text = c.country,
        Value = c.countryid.ToString()
    });
}

ViewBag.countrydrop = item8;
return View();

Я не знаю, как решить это.

Ответ 1

В вашем действии измените ViewBag.countrydrop = item8 на ViewBag.country = item8; и в View напишите вот так:

@Html.DropDownList("country",
                   (IEnumerable<SelectListItem>)ViewBag.country,
                   "Select country")

Собственно, когда вы пишете

@Html.DropDownList( "страна",                          (IEnumerable) ViewBag.country,                           "Выбрать страну" )

или

Html.DropDownList( "страна", "Выбрать страну" )

он ищет IEnumerable<SelectListItem> в ViewBag с ключевым страной, вы также можете использовать эту перегрузку в этом случае:

@Html.DropDownList("country","Select country") // it will look for ViewBag.country and populates dropdown

См. Рабочий пример DEMO

Ответ 2

Если вы использовали DropDownListFor следующим образом:

@Html.DropDownListFor(m => m.SelectedItemId, Model.MySelectList)

где MySelectList в модели было свойством типа SelectList, эта ошибка может быть выбрана, если свойство было null.

Избегайте этого путем простой инициализации его в конструкторе, например:

public MyModel()
{
    MySelectList = new SelectList(new List<string>()); // empty list of anything...
}

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

Ответ 3

Обратите внимание, что список выбора отправлен как null, поэтому ваша ошибка жалуется, что свойство viewdata не может быть найдено.

Всегда повторите инициализацию своего списка выбора в рамках действия POST.

Для дальнейшего объяснения: Persist SelectList в модели в сообщении

Ответ 4

Вы можете использовать это:

 var list = new SelectList(countryList, "Id", "Name");
 ViewBag.countries=list;
 @Html.DropDownList("countries",ViewBag.countries as SelectList)

Ответ 5

попробуйте это

@Html.DropDownList("ddlcountry",(List<SelectListItem>)ViewBag.countrydrop,"Select country")

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

ViewBag.countrydrop = ds.getcountry().Select(x => new SelectListItem { Text = x.country, Value = x.countryid.ToString() }).ToList();

Ответ 6

У меня была та же проблема, и я нашел решение, которое я должен поместить код, чтобы извлечь раскрывающийся список из базы данных в методе редактирования. Это сработало для меня. Решение для аналогичной проблемы

Ответ 7

В моем случае ошибка произошла из-за того, что я не инициализировал список выбора в контроллере следующим образом:

viewModel.MySelectList = new List<System.Web.Mvc.SelectListItem>();

Как ни один из существующих ответов не дал мне этого понять, я публикую это. Возможно, это помогает кому угодно.

Ответ 8

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

index.cshtml:

@using expert.Models;
@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
    Manager db = new Manager();
    ViewBag.FORM_PRESTATION = new SelectList(db.T_BDE_PRESTATION_PRES.OrderBy(p => p.PRES_INTITULE).Where(p => p.T_B_PRES_ID == null), "PRES_ID", "PRES_INTITULE");

}


<div class="form-group">                    
<label class = "w3-blue" style ="text-shadow:1px 1px 0 #444">Domaine:</label>
  <div class="col-md-10">
 @Html.DropDownList("FORM_PRESTATION", null, htmlAttributes: new { @class = "w3-select ", @required = "true" })
</div>
</div>

Ответ 9

Попробуйте это.

Контроллер:

List<CountryModel> countryList = db.countryTable.ToList();
ViewBag.Country = new SelectList(countryList, "Country", "CountryName");