DropDownListДля выбора значения
Я использую метод DropDownListFor helper внутри страницы редактирования, и мне не удастся заставить его выбрать значение, которое я указываю. Я заметил аналогичный вопрос в Stackoverflow. Предлагаемое решение проблемы заключается в том, чтобы "заполнить свой SelectList в коде просмотра". Проблема в том, что я уже пробовал это, но он все еще не работает.
<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>
Я установил точку останова и проверил существование (и действительность) модели .AddressStateAbbr. Я просто не уверен, что мне не хватает.
Ответы
Ответ 1
После исследования в течение часа я обнаружил проблему, из-за которой выбранный не получил значение DropDownListFor
. Причина в том, что вы используете имя ViewBag так же, как свойство модели.
Пример
public class employee_insignia
{
public int id{get;set;}
public string name{get;set;}
public int insignia{get;set;}//This property will store insignia id
}
// If your ViewBag name same as your property name
ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);
Вид
@Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")
Выбранная опция не будет выбрана в раскрывающемся списке, НО Когда вы измените имя ViewBag на другое имя, выбранный параметр будет отображаться правильно.
Пример
ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);
Просмотр
@Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")
Ответ 2
Try:
<%= Html.DropDownListFor(
model => model.AddressStateAbbr,
new SelectList(
Model.States.OrderBy(s => s.StateAbbr),
"StateAbbr",
"StateName",
Model.AddressStateAbbr), "-- Select State --")%>
или синтаксис Razor:
@Html.DropDownListFor(
model => model.AddressStateAbbr,
new SelectList(
Model.States.OrderBy(s => s.StateAbbr),
"StateAbbr",
"StateName",
Model.AddressStateAbbr), "-- Select State --")
Помощники на основе выражений, похоже, не уважают свойство Selected из SelectListItems в вашем SelectList.
Ответ 3
Если вы делаете это правильно и используете модель - в отличие от всех этих виджетов ViewBag - и все еще видите проблему, потому что @Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)
не может соответствовать MyValue
с вариантами, которые она имеет в MyOptions
, Две возможные причины этого:
-
MyValue
имеет значение null. Вы не установили его в своей модели ViewModel. Создание одного из MyOptions
имеет Selected=true
, не решит этого.
- Более тонко, тип
MyValue
отличается от типов в MyOptions
. Так что, если MyValue
- (int) 1
, но ваш MyOptions
представляет собой список проложенных строк {"01", "02", "03", ...}
, он явно не собирается ничего выбирать.
Ответ 4
Не рассматривая этот вопрос, он может помочь будущим гуглерам, если они будут следовать моему пути мысли:
Мне нужен множественный выбор, и этот атрибут hack на DropDownListFor не был автоматически выбран
Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })
вместо этого я должен был использовать ListBoxFor, который заставил все работать
Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)
Ответ 5
У меня тоже есть аналогичная проблема, и я решаю ее следующим образом:
установите
model.States свойство на вашем контроллере к тому, что вам нужно выбрать
model.States = "Калифорния"
а затем вы получите значение "Калифорния" в качестве значения по умолчанию.
Ответ 6
эта проблема распространена. измените имя свойства viewbag на другое имя модели, используемое на странице.
Ответ 7
Еще одна вещь, чтобы проверить, не все ли это ваш собственный код, чтобы убедиться, что функция javascript не меняет значение на загрузке страницы. Через несколько часов, ударив головой о стену, просматривая все эти решения, я обнаружил, что это то, что происходило со мной.
Ответ 8
Я столкнулся с этой проблемой недавно. Это сводило меня с ума в течение часа. В моем случае я не использовал переменную ViewBag
с тем же именем, что и у свойства модели.
После отслеживания изменений управления исходным кодом проблема оказалась в том, что у моего действия был аргумент с тем же именем, что и у свойства модели:
public ActionResult SomeAction(string someName)
{
var model = new SomeModel();
model.SomeNames = GetSomeList();
//Notice how the model property name matches the action name
model.someName = someName;
}
По мнению:
@Html.DropDownListFor(model => model.someName, Model.SomeNames)
Я просто изменил аргумент действия на другое имя, и оно снова заработало:
public ActionResult SomeAction(string someOtherName)
{
//....
}
Я полагаю, что можно также изменить имя свойства модели, но в моем случае имя аргумента не имеет смысла, так что...
Надеюсь, этот ответ спасет кого-то еще от неприятностей.
Ответ 9
Проблема по крайней мере для меня была связана с IEnumerable<T>
.
По сути, получилось так, что представление и модель не имели одинаковую ссылку на одно и то же свойство.
Если вы делаете это
IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}
Затем свяжите это, используя
@Html.DropDownListFor(model => model.Id, Model.CoolNames)
Вид теряет свойство CoolNames. Простое исправление заключается в добавлении .ToList()
После создания проекции (.Select()
);).
Ответ 10
У меня такая же проблема. В приведенном ниже примере переменная ViewData ["DATA_ACREDITO_MODELO_INTEGRADO"] имеет список SelectListItem с выбранным значением по умолчанию, но такой атрибут не отображается визуально.
// data
var p_estadoAcreditacion = "NO";
var estadoAcreditacion = new List<SelectListItem>();
estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)" , Value = " " });
estadoAcreditacion.Add(new SelectListItem { Text = "SI" , Value = "SI" });
estadoAcreditacion.Add(new SelectListItem { Text = "NO" , Value = "NO" });
if (!string.IsNullOrEmpty(p_estadoAcreditacion))
{
estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
}
Я решил это, сделав первый аргумент DropdownList, отличный от атрибута id.
// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id = "SELECT__ACREDITO_MODELO_INTEGRADO"
...