Кажется, что @Html.DropDownList не может выполнить рендеринг с выбранным набором значений. У меня есть пример:
@foreach (SelectListItem item in ViewBag.Agare as List<SelectListItem>)
{
<div>
Item: Name: @(item.Text) Value: @(item.Value) Selected: @(item.Selected)
</div>
}
<div class="editor-field">
@Html.DropDownList("Agare", ViewBag.Agare as List<SelectListItem>, new {@class = "chzn-select" })
</div>
И результат:
Название: Demo Yacht Club Значение: 1 Выбрано: False
Имя: Anders Jansson Значение: 100 Выбрано: False
Имя: Per Kyrk Значение: 101 Выбрано: False
Имя: Oskar Persson Значение: 102 Выбрано: True
Имя: Pluten Snutten Значение: 204 Выбрано: False
И первые параметры всегда являются значениями по умолчанию!
Выделенный код:
<select class="chzn-select" id="Agare" name="Agare" required="required">
<option value="1">Demo Yacht Club</option>
<option value="100">Anders Jansson</option>
<option value="101">Per Kyrk</option>
<option value="102">Oskar Persson</option>
<option value="204">Pluten Snutten</option>
</select>
Стоит отметить, что я также использую Choosen для создания DropDown, но не имеет значения, перестану ли я его использовать. В противном случае это очень прямо вперед!
И мои версии: Visual Studio Express 2013 для Интернета. MVC 5.0.0 Asp.Net Razor 3.0.0 Asp.Net Web API 5.0.0 Asp: net Web Pages 3.0.0 EF 6.0.1 выбран 0.12.0
Есть идеи?
Попробуйте изменить имя вашего DropDownList 'Agare', чтобы оно отличалось от вашего свойства ViewBag. Странно, я знаю!
@Html.DropDownList("SomethingElse", ViewBag.Agare as List<SelectListItem>, new {@class = "chzn-select" })
Изменено имя свойства ViewBag, и теперь оно работает.
@Html.DropDownList("Agare", ViewBag.ListOfAgare as List<SelectListItem>, new { required = "required", @class = "chzn-select" })
Почему это?
Не используйте ViewBag
. Лучшее решение более важно, чем просто проблема. Если вы ищете в Интернете, чтобы "ViewBag SelectListItem не работал", вы можете найти много, поэтому я предлагаю вам использовать VIewModel.
ниже приведен пример.
ViewModel
public class SportsViewModel
{
public string SelectedSports { get; set; }
public IEnumerable<SelectListItem> Sportses { get; set; }
}
действие
public ActionResult Sport()
{
var model = new SportsViewModel();
//_sportses is a list for sports
// get selectedSprortsId value for dropdown selected item.
model.Sportses = _sportses.Select(m => new SelectListItem {Value = m.Id.ToString(), Text = m.Name, Selected = m.Id == selectedSprortsId});
return View(model);
}
Посмотреть
@model SportsViewModel
@foreach (var item in Model.Sportses)
{
<div>
Item: Name: @(item.Text) Value: @(item.Value) Selected: @(item.Selected)
</div>
}
<div class="editor-field">
@Html.DropDownList("SelectedSports", Model.Sportses, new { @class = "chzn-select" })
</div>
Обновить:
Если вы не можете переключиться на ViewModel
, вы можете использовать SelectList
и установить весь список в свой ViewBag, как показано ниже:
var SelectListItemList = (from s in _sportses
select new SelectListItem
{
Text = s.Name,
Value = s.Id.ToString(),
}).ToList();
ViewBag.Agare = new SelectList(SelectListItemList , "Value", "Text", selectedSprortsId);
Тогда, по вашему мнению, вы по-прежнему можете использовать свой существующий код только as List<SelectListItem>
".
@foreach (SelectListItem item in ViewBag.Agares)
{
<div>
Item: Name: @(item.Text) Value: @(item.Value) Selected: @(item.Selected)
</div>
}
<div class="editor-field">
@Html.DropDownList("Agare", ViewBag.Agare as List<SelectListItem>, new { @class = "chzn-select" })
Selected
если он не находит предоставленное ViewData значение с данным ключом, в данном случае «Agare». В противном случае он перестраивает список выбора и устанавливает параметр selected, еслиoption.value == ViewData["Agare"]
.