我正在使用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 --") %>
我不确定我做错了什么?我会很感激一些意见:)
感谢。
答案 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,使用视图模型和强类型视图。