ASP.NET MVC 2下拉问题

时间:2010-09-13 13:18:02

标签: asp.net-mvc

我正在使用MVC 2和实体框架4.在我的创建应用程序页面上,我有一个下拉列表,其中填充了我的AccountType枚举值。我就这样做了:

public ActionResult Create()
      {
         // Get the account types from the account types enum
         var accountTypes = from AccountType at
                            in Enum.GetValues(typeof(AccountType))
                            select new
                            {
                               AccountTypeID = (int)Enum.Parse(typeof(AccountType), at.ToString()),
                               AccountTypeName = GetEnumFriendlyName(at)
                            };
         ViewData["AccountTypes"] = new SelectList(accountTypes, "AccountTypeID", "AccountTypeName");

         return View();
      }

这是我的代码对于此下拉列表数据的样子:

<%= Html.DropDownList("AccountTypeID", (SelectList)ViewData["AccountTypes"], "-- Select --") %>

页面加载后,我开始输入一些值。我从下拉列表中选择一个值。输入所有必需的输入后,我点击提交。以下只是代码的一部分:

[HttpPost]
      public ActionResult Create(Application application)
      {
         if (ModelState.IsValid)
         {
            application.ApplicationState = (int)State.Applying;
         }

         return View();
      }

然后我得到以下错误,不确定它是什么意思,但我做了谷歌,尝试了样本,但我仍然收到消息。以下是错误消息:

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'AccountTypeID'.

我甚至将视图中的下拉列表更改为:

<%= Html.DropDownList("AccountTypeID", (IEnumerable<SelectListItem>)ViewData["AccountTypes"], "-- Select --") %>

我不确定我做错了什么?我会很感激一些意见:)

感谢。

2 个答案:

答案 0 :(得分:1)

第一个: 你不能有可选值转换为Enum所以你应该在你的Post中收到一个字符串然后做一些逻辑把它投给你枚举:

    [HttpPost]
    public ActionResult Create(string application)
    {
        if (ModelState.IsValid)
        {
            // Do your stuff here to convert this string to your Enum 
            // But you should take care for null string
        }

        return View();
    }

第二个: 您的DropDownList ID应该与您的Post动作参数的名称相同:如果您放置

<%: Html.DropDownList("applicationID", (SelectList)ViewData["AccountTypes"], "-- Select --")%>

那么您的操作应该具有“applicationID”参数而不是“application”

答案 1 :(得分:1)

在您的POST操作中,您需要像在GET操作中一样填充ViewData["AccountTypes"],因为您返回相同的视图,此视图取决于它:

[HttpPost]
public ActionResult Create(Application application)
{
    if (ModelState.IsValid)
    {
        application.ApplicationState = (int)State.Applying;
    }

    ViewData["AccountTypes"] = ... // same stuff as your GET action
    return View();
}

显然,当我看到有人使用ViewData而不是视图模型和强类型视图时,我总是会做出通常的免责声明:不使用ViewData,使用视图模型和强类型视图。