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. Я просто не уверен, что мне не хватает.

Ответы:


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")

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.


Благодаря! Мне нужен был быстрый способ получить выбранное значение из репозитория базы данных! 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 не меняет значение при загрузке страницы. После нескольких часов, когда я бился головой о стену, читая все эти решения, я обнаружил, что именно это и происходит со мной.


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)
{
    //....
}

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

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


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());).


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" })
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.