Я пытаюсь создать форму в ASP.NET MVC2 RC 2, основанную на объекте события календаря. Объект имеет eventTypeId, который является System.Int32, который мне нужно заполнить с помощью списка выбора.
Контроллер для создания начального вида:
[WAuthorize]
public ActionResult AddCalendarEvent()
{
CalendarEventTypesManager calendarEventTypesManager =
new CalendarEventTypesManager();
ViewData["eventTypeId"] = new SelectList(
calendarEventTypesManager.SelectAll(), "Id", "Type");
return View();
}
Фрагмент представления (с заголовком):
<%@ Page Title="" Language="C#"
MasterPageFile="~/Views/Shared/Site.Extranet.master"
Inherits="System.Web.Mvc.ViewPage<SomeProject.Models.CalendarEvent>" %>
...
<p><%= Html.DropDownList("eventTypeId") %></p>
Что приводит к HTML:
<p>
<select id="eventTypeId" name="eventTypeId">
<option value="1">All school activities</option>
<option value="2">All school event</option>
</select>
</p>
POST-принимающий контроллер:
[WAuthorize]
// TODO research some more
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult AddCalendarEvent(CalendarEvent newEvent)
{
...
(я пытался добавить [Bind (Exclude="eventTypeId")]
перед параметром "CalendarEvent newEvent", но это не меняет поведения.)
Проблема: при отправке формы я получаю исключение InvalidOperationException:
Элемент ViewData, имеющий ключ
'eventTypeId' имеет тип
'System.Int32', но должен иметь тип
'IEnumerable .
Я посмотрел несколько примеров здесь и в блогах MVC, но пока неясно, как это должно работать (похоже, основываясь на многих примерах, оно должно работать как есть). Нужно ли создавать вторую модель с переменной типа SelectListItem для принятия SelectListItem и преобразования значения в System.Int32 для фактической установки eventTypeId? Это кажется довольно круглым.