DropDownList: если не выбрать значение

83

Я использую вспомогательный метод DropDownListFor внутри страницы редактирования, и мне не удалось заставить его выбрать указанное мной значение. Я заметил аналогичный вопрос по Stackoverflow. Предлагаемый обходной путь заключался в том, чтобы «заполнить список SelectList в коде представления». Проблема в том, что я уже пробовал это, но до сих пор не работает.

<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>

Я установил точку останова и проверил существование (и действительность) model.AddressStateAbbr. Я просто не уверен, что мне не хватает.

Senfo
источник

Ответы:

184

Проведя час исследования, я обнаружил проблему, из-за которой не удается установить выбранный элемент 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's 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")
wut-excel
источник
34
На самом деле это правильный ответ !!! Всем, кто ищет в Google, убедитесь, что вы не называете свойство ViewBag таким же, как свойство модели! Я не ожидал, что это будет иметь значение, но на самом деле это исправило. Я в шоке.
Tesserex
10
У меня та же проблема, хотя свойство ViewBag имеет другое имя, чем свойство модели:@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Пол Тейлор,
8
Кто-нибудь знает причину, по которой они не могут быть одинаковыми? Этот ответ спас мой ноутбук от
разрушения
7
Я не понимаю У меня тоже возникла эта проблема, и мы не используем ViewBag. Также вопрос не использовал ViewBag
Джордж Мауэр
3
Я считаю это ошибкой ASP.NET MVC!
Нестор Санчес А.
30

Пытаться:

<%= 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.

BnWasteland
источник
Благодаря! Мне нужен был быстрый способ получить выбранное значение из репозитория базы данных! Model.AddressStateAbbr была той частью, которая мне была нужна. Сладкий.
Еще
30

Если вы делаете это правильно и используете модель - в отличие от всех этих чудаков с ViewBag - и все еще видите проблему, это потому, что @Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)вы не можете соответствовать MyValueвыбору, в котором она есть MyOptions. Для этого есть две возможные причины:

  1. MyValueнулевой. Вы не установили его в своей ViewModel. Сделать один из MyOptionsних Selected=trueне решит.
  2. Более тонко, то тип из MyValueотличается от типов в MyOptions. Так что вроде, если MyValueесть (int) 1, но у вас MyOptionsсписок строк с дополнениями {"01", "02", "03", ...}, он, очевидно, ничего не выберет.
Чад Хеджкок
источник
4
Большое спасибо за этот ответ. Я также не понимаю, почему все используют ViewBag вместо создания правильной модели представления. Этот ответ пристально смотрел мне в лицо, и я ценю, что вы соединили точки.
Неоднозначность
2
# 2 вот моя проблема. У меня есть свойство модели, которое является типом делегата с настраиваемым связывателем модели, которое принимает имя метода и фактически связывает этот метод из списка вызовов предопределенных методов, которые соответствуют сигнатуре делегата. Кто-нибудь нашел, что нужно обойти № 2 и правильно выбрать его без каких-либо хакерских клиентских скриптов?
mikeschuld
1
Благодарность от другого хипстера, использующего View Models: D
Владимир Божич
1
Кроме того , для тех , кто имеет SelectList с другим значением атрибута , чем отображения текста между тегами опционам, например: <option value="2">some text</option>. Похоже, что на самом деле он пытается сопоставить свойство модели представления с отображаемым текстом, а не атрибутом значения, чтобы выбрать выбранный параметр. Это заставляло меня какое-то время.
Джейсон Хэнсон
17

Не отвечая на этот вопрос - это может помочь будущим гуглерам, если они последуют моему пути мысли:

Я хотел множественный выбор, и этот хак атрибутов в DropDownListFor не выбирал автоматически

Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })

вместо этого я должен был использовать ListBoxFor, который заставил все работать

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)
фиат
источник
6
Я пошел по твоей мысли. Мир: если вы используете DropDownListFor и несколько, вы хотели использовать ListBoxFor.
Скотт Стаффорд
Обидно, что работает. В другом месте моего кода, со всем тем же, DropDownListFor работает нормально. Я провел четыре или пять часов, играя с этим, чтобы попытаться заставить его работать. Это была моя последняя кювета, и это сработало.
Брайан Хоббс,
1

У меня тоже есть аналогичная проблема, и я решаю ее следующим образом: установите

model.States на вашем контроллере на то, что вам нужно выбрать

model.States = "Калифорния"

и тогда вы получите значение по умолчанию «Калифорния».

Прагит богаж
источник
0

эта проблема распространена. измените имя свойства viewbag на другое, чем имя переменной модели, используемой на странице.

Селия Хилал
источник
0

Еще одна вещь, которую нужно проверить, это не весь ваш собственный код, - это убедиться, что функция javascript не меняет значение при загрузке страницы. После нескольких часов, когда я бился головой о стену, читая все эти решения, я обнаружил, что именно это и происходит со мной.

BMills
источник
0

Я столкнулся с этой проблемой недавно. Это сводило меня с ума около часа. В моем случае я не использовал 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)
{
    //....
}

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

Надеюсь, этот ответ избавит кого-то от неприятностей.

JuanR
источник
0

По крайней мере, для меня проблема была связана с IEnumerable<T>.

По сути, произошло то, что представление и модель не имели одинаковых ссылок на одно и то же свойство.

Если ты сделаешь это

IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}

Затем свяжите это, используя

@Html.DropDownListFor(model => model.Id, Model.CoolNames)

View теряет свойство CoolNames, простое исправление - просто добавить .ToList()After dooing a projection ( .Select());).

jNi
источник
0

У меня такая же проблема. В приведенном ниже примере переменная 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;
        }
         ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;

Я решил это, сделав первый аргумент 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"

...

Пабло Алехандро Перес Акоста
источник
0

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

Оказывается, проблема заключалась в том, что свойство модели называлось «Title», я переименовал его в «GivenTitle», и теперь оно работает должным образом.

Из

Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })

к

Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })
Саймон
источник