Я пытаюсь создать форму в ASP.NET MVC2 RC 2, который основан на календарном объекте-событии. Объект имеет eventTypeId, который является Системой. 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', имеет тип 'Система. Int32', но должен иметь тип 'IEnumerable <SelectListItem>'.
Я посмотрел на многие примеры здесь и на блогах MVC, но до сих пор не ясно, как это, как предполагается, работает (это похоже на основе многих примеров, это должно работать, как). Сделайте я должен создать вторую модель, которая имеет переменную типа SelectListItem, чтобы принять SelectListItem и преобразовать значение в Систему. Int32 для фактической установки eventTypeId? Это кажется скорее вокруг.
Подумав об этом еще немного, я решил, что, возможно, мне нужно заполнить ViewData["eventTypeID"]
в действии контроллера, которое получает опубликованные значения - не только в действии контроллера, которое устанавливает форму. Я попробовал, и это сработало.
Действие контроллера, принимающее POST, было изменено (добавлены последние две строки в этом листинге):
[WAuthorize]
[ValidateInput(false)] // TODO research some more
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult AddCalendarEvent(CalendarEvent newEvent)
{
CalendarEventTypesManager calendarEventTypesManager = new CalendarEventTypesManager();
ViewData["eventTypeId"] = new SelectList(calendarEventTypesManager.SelectAll(), "Id", "Type");
....
Это было непонятно для меня, так что, надеюсь, кто-то еще найдет это полезным. Я проверил фактический HTTP POST с помощью плагина LiveHTTPHeaders для Firefox и действительно entryTypeID передается как "...&entryTypeId=2&...". (я выбрал второй элемент в форме перед отправкой), но нужно ли перезагружать список select в контроллере posted-to для валидации?
.