5

我正在尝试在 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 异常:

具有键“eventTypeId”的 ViewData 项属于“System.Int32”类型,但必须属于“IEnumerable<SelectListItem>”类型。

我在这里和 MVC 博客上查看了许多示例,但到目前为止还不清楚这应该如何工作(它看起来基于许多示例,它应该按原样工作)。我是否需要创建具有 SelectListItem 类型变量的第二个模型来接受 SelectListItem 并将值转换为 System.Int32 以实际设置 eventTypeId?这似乎相当圆润。

4

2 回答 2

7

在考虑了更多之后,我想也许我需要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");
        ....

这对我来说并不清楚,所以希望其他人也觉得这很有用。我用 Firefox 的 LiveHTTPHeaders 插件检查了实际的 HTTP POST,确实 entryTypeID 被发布为“...&entryTypeId=2&...”(我在提交之前选择了表单上的第二项)但是我们是否重新加载了选择列表中的发布到控制器进行验证?

于 2010-03-02T19:48:29.360 回答
2

如果 ViewData 不包含视图上所有字段的必需值并且 ViewData 被回发到视图,则会出现此问题。

于 2010-11-18T06:09:34.737 回答