我正在尝试在 ASP.NET MVC2 RC 2 中创建一个基于日历事件对象的表单。该对象具有 eventTypeId,它是一个 System.Int32,我需要通过选择列表填充它。
创建初始 View 的 Controller 是:
[WAuthorize]
public ActionResult AddCalendarEvent()
{
CalendarEventTypesManager calendarEventTypesManager =
new CalendarEventTypesManager();
ViewData["eventTypeId"] = new SelectList(
calendarEventTypesManager.SelectAll(), "Id", "Type");
return View();
}
View 的片段(带有标题)是:
<%@ Page Title="" Language="C#"
MasterPageFile="~/Views/Shared/Site.Extranet.master"
Inherits="System.Web.Mvc.ViewPage<SomeProject.Models.CalendarEvent>" %>
...
<p><%= Html.DropDownList("eventTypeId") %></p>
结果是:
<p>
<select id="eventTypeId" name="eventTypeId">
<option value="1">All school activities</option>
<option value="2">All school event</option>
</select>
</p>
POST 接受 Controller 是:
[WAuthorize]
// TODO research some more
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult AddCalendarEvent(CalendarEvent newEvent)
{
...
(我尝试在“CalendarEvent newEvent”参数前面添加
[Bind (Exclude="eventTypeId")]
但它不会改变行为。)问题:当我提交表单时,我收到一个 InvalidOperationException 异常:
The ViewData item that has the key 'eventTypeId' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.
我在这里和 MVC 博客上查看了许多示例,但到目前为止还不清楚这应该如何工作(看起来基于许多示例,它应该按原样工作)。我是否需要创建具有 SelectListItem 类型变量的第二个模型来接受 SelectListItem 并将值转换为 System.Int32 以实际设置 eventTypeId?这似乎有点绕。
最佳答案
再想一想,我想也许我需要填充ViewData["eventTypeID"]
在接收发布值的 Controller 操作中——而不仅仅是在设置表单的 Controller 操作中。我试过了,它奏效了。
接受 POST 的 Controller 操作已更改(添加此 list 中的最后两行):
[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&...”(我在提交之前选择了表单上的第二项)但是我们是否重新加载了选择列表发布到 Controller 进行验证?
关于asp.net-mvc - 通过 ViewData : type mismatch on submit 为 DropDownList 提供 SelectList 的强类型 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2365824/