Html.DropDownList и привязка модели - PullRequest
3 голосов
/ 20 ноября 2008

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

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

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 = "")], чтобы увидеть, удалит ли это ошибку "пустое имя не разрешено"
  • Добавление имени параметра моего действия в имя моего элемента управления

1 Ответ

3 голосов
/ 21 ноября 2008

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

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

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

[AcceptVerps(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix="")]HomeViewdata d)
...