DropDownListFor Не выбирая значение - PullRequest
74 голосов
/ 17 февраля 2010

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

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

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

Ответы [ 9 ]

172 голосов
/ 14 августа 2012

После исследования в течение часа я обнаружил проблему, из-за которой для выбранного не устанавливается значение 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);

View

 @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")
30 голосов
/ 17 февраля 2010

Попробуйте:

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

22 голосов
/ 23 июля 2016

Если вы делаете это правильно и используете модель - в отличие от всех этих странностей 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", ...}, то, очевидно, ничего выбирать не будет.
16 голосов
/ 27 июня 2012

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

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

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

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

Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)
1 голос
/ 20 апреля 2016

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

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

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

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

0 голосов
/ 28 мая 2019

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

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

Если вы сделаете это

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

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

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

Вид теряет свойство CoolNames, простое исправление - это просто добавить .ToList() После создания проекции (.Select());).

0 голосов
/ 10 мая 2019

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

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

0 голосов
/ 02 июня 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...