我正在尝试在 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?这似乎相当圆润。