Почему привязка модели не работает с 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 ... НУЛЕВОЙ
Если я проделаю то же самое упражнение, но, например, с текстовым полем, все будет работать нормально ...
--РЕДАКТИРОВАТЬ--
Вещи, которые я пробовал после этого поста:





Ах, проблема здесь в том, что по соглашению связыватель модели ищет значения в форме «d.PropertyName», потому что аргумент вашего метода действия Index - «d».
Поскольку у вас может быть несколько аргументов для метода действия, мы используем имя аргумента в качестве префикса по умолчанию.
Исправить это легко, просто используйте атрибут Bind, чтобы указать MVC не использовать префикс.
[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix = "")]HomeViewdata d)
Я думаю, что парсер SO удаляет пробелы между кавычками в комментариях. Значит, это должно быть [Bind (Prefix = "[aSpace]")]
Затем я попробовал сделать наоборот: я попытался создать помощник Html на моей странице aspx следующим образом: <% = Html.DropDownList ("d.List"); но затем я получаю сообщение об ошибке, что нет такого поля для привязки.
Если вы внесете это изменение, вам необходимо убедиться, что ViewData ["d.List"] содержит элементы для раскрывающегося списка.
Фил, сегодня я проверил ваш ответ на своей демонстрационной странице. Я получил сообщение об ошибке, что имя не может быть пустым. Поэтому я изменил атрибут привязки на [Bind (Prefix = "")]. Теперь он работает без ошибок, но также с тем же результатом, с которого я начал.