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"

...