Представление со строгим контролем типов с SelectList для DropDownList через ViewData: несоответствие типов на отправляет

Я пытаюсь создать форму в 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? Это кажется скорее вокруг.

5
задан bernhof 11 March 2013 в 19:48
поделиться

1 ответ

Подумав об этом еще немного, я решил, что, возможно, мне нужно заполнить 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 для валидации?

.
7
ответ дан 14 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: