DropDownListЗа не вибираючи значення


83

Я використовую допоміжний метод DropDownListFor всередині сторінки редагування, і мені не пощастило отримати його, щоб вибрати вказане значення. Я помітив подібне запитання щодо Stackoverflow. Запропонованим обхідним шляхом було "заповнити ваш SelectList у коді подання". Проблема в тому, що я вже спробував це, і все ще не працює.

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

Я встановив точку зупинки та перевірив існування (та дійсність) моделі.AddressStateAbbr. Я просто не впевнений, чого мені не вистачає.

Відповіді:


182

Провівши дослідження протягом години, я виявив проблему, яка спричиняє невстановлення вибраного 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
Це насправді правильна відповідь !!! Усім, хто гуглить, переконайтесь, що ви не називали властивість ViewBag так само, як властивість моделі! Я зовсім не сподівався, що це матиме значення, але насправді це виправило. Я вражений.
Tesserex

10
У мене така сама проблема, хоча властивість ViewBag має іншу назву, ніж властивість моделі:@Html.DropDownListFor(model => model.Title, (SelectList)ViewBag.Salutation, Resources.Labels.Unknown )
Пол Тейлор

8
Хтось знає причину, чому вони не можуть бути однаковими? Ця відповідь врятувала мій ноутбук від
розгрому

7
Я не розумію. У мене також є ця проблема, і ми не використовуємо ViewBag. Також питання не стосувалось ViewBag
George Mauer

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 - це та частина, яка мені потрібна. Солодкий. Ще раз спасибі
Tom Stickel

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
Дякую ще одному хіпстеру, який використовує Моделі перегляду: D
Володимир Божич

1
Крім того , для тих , хто має SelectList з іншим значенням атрибута , ніж відображення тексту між тегами опціонах, наприклад: <option value="2">some text</option>. Схоже, насправді намагаємось зіставити властивість моделі подання з текстом відображення, а не атрибутом value, щоб вибрати обраний параметр. Це змусило мене деякий час.
Джейсон Хенсон,

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)

Перегляд втрачає слід властивості CoolNames, просте виправлення - це просто додати .ToList()Після створення проекції ( .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.