2008-11-20 3 views
3

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

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

HomeViewData : ViewDataDictionary 
+List : SelectList 

Добавлен ViewData к классу 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();%> 

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

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

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

ответ

3

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

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

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

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

Phil, сегодня я проверил ваш ответ на своей демонстрационной странице. Я получил ошибку, что имя не может быть нулевым. Поэтому я изменил атрибут bind на [Bind (Prefix = "")] Теперь он работает без ошибок, но также с тем же результатом, с которого я начал работать. – 2008-11-24 08:50:49

Смежные вопросы