Нет элемента 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");