Html.DropDownList и привязка модели

Почему привязка моделей не работает в DropDown?
Что я делаю не так?
Чтобы проиллюстрировать свою проблему, я сделал следующее:

Создан новый проект asp.net MVC (beta1) Создан следующий класс:

HomeViewData : ViewDataDictionary  
+List : SelectList

Добавлены данные представления в класс HomeController следующим образом

Homecontroller: Controller
+HomeViewData vd = new HomeViewData

В мой метод Home.Index () добавлены следующие строки

vd.list = new SelectList(new List<string>(){"test", "test1", "test2"});
return View("Index", vd);

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

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index(HomeViewdata d)

Здесь я добавил точку останова в первую строку кода.
Затем я добавил следующий код в свой Index.aspx

<%Html.BeginForm();%>
    <%=Html.DropDownList("List")%>
<%Html.EndForm();%>

В результате я получаю страницу с красивым раскрывающимся списком со значениями test, test1 и test2.
Затем, выбрав значение, я нажимаю клавишу ввода (не заморачивался с кнопкой отправки) и смотрю, как моя точка останова останавливает код. Я проверяю значение HomeViewData ... NULL

Если я проделаю то же упражнение, но, например, с текстовым полем, все будет работать нормально ...
--EDIT--
Что я пробовал после этого поста:

  • Добавление атрибута [Bind (Prefix = "")] к моему действию по предложению Фил
  • Добавление [Bind (Prefix = "")], чтобы проверить, устранит ли это ошибку "пустое имя не разрешено"
  • Добавление имени параметра моего действия в имя элемента управления

person Boris Callens    schedule 20.11.2008    source источник


Ответы (1)


Ах, проблема здесь в том, что по соглашению связыватель модели ищет значения в форме «d.PropertyName», потому что аргумент вашего метода действия Index - «d».

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

Исправить это легко, просто используйте атрибут Bind, чтобы указать MVC не использовать префикс.

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix="")]HomeViewdata d)
person Haacked    schedule 21.11.2008
comment
Фил, сегодня я проверил ваш ответ на своей демонстрационной странице. Я получил сообщение об ошибке, что имя не может быть пустым. Поэтому я изменил атрибут привязки на [Bind (Prefix =)]. Теперь он работает без ошибок, но с тем же результатом, с которого я начал. - person Boris Callens; 24.11.2008
comment
Я думаю, что парсер SO удаляет пробелы между кавычками в комментариях. Значит, это должно быть [Bind (Prefix = [aSpace])] - person Boris Callens; 24.11.2008
comment
Затем я попробовал сделать наоборот: я попытался создать помощник Html на моей странице aspx следующим образом ‹% = Html.DropDownList (d.List); но затем я получаю сообщение об ошибке, что нет такого поля для привязки. - person Boris Callens; 24.11.2008
comment
Если вы внесете это изменение, вам необходимо убедиться, что ViewData [d.List] содержит элементы для раскрывающегося списка. - person Haacked; 04.12.2008