asp.net-mvc - 通过 ViewData : type mismatch on submit 为 DropDownList 提供 SelectList 的强类型 View

标签 asp.net-mvc post drop-down-menu selectlist selectlistitem

我正在尝试在 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/

相关文章:

asp.net-mvc - 如何测试 ASP.NET MVC 项目

c# - 从 ASP.NET WebForms 迁移到 MVC

android - HTTPURLConnection - 使用 FixedLengthStreamingMode 发布带有大文件的多部分/表单数据

php - 表格中的 HTML 表单不会通过 POST 发送所有可用数据

ios - 从通过 WebSocket 发送的 JSON 数据在 Swift 中发送 POST 请求

html - CSS 下拉问题 - 当鼠标在它下面时会掉线吗?

c# - Entity Framework 无法保存 - Datetime2 到 DateTime 的转换失败

asp.net-mvc - 如何从 OnResultExecuted 中获取 ActionDescription UniqueId

css - 在 IE 中,我的下拉菜单实际上是正确的。我怎样才能解决这个问题?

javascript - 如何启动基于下拉选择的 jQuery 对话框