这就是我的数据模型类:
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Position Position { get; set; }
}
public class Position
{
public string Title { get; set; }
}
我有一个创建视图,我希望有两个文本框用于名字和姓氏,然后是一个具有位置标题的下拉框。我试着这样做:
查看(仅相关部分):
<p>
<label for="Position">Position:</label>
<%= Html.DropDownList("Positions") %>
</p>
控制器:
//
// GET: /Employees/Create
public ActionResult Create()
{
ViewData["Positions"] = new SelectList(from p in _positions.GetAllPositions() select p.Title);
return View();
}
//
// POST: /Employees/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Employee employeeToAdd)
{
try
{
employeeToAdd.Position = new Position {Title = (string)ViewData["Positions"]};
_employees.AddEmployee(employeeToAdd);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
然而,当我点击提交时,我得到了这个例外:
System.InvalidOperationException was unhandled by user code
Message="There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Positions'."
我很确定我做错了。填充下拉框的正确方法是什么?
答案 0 :(得分:3)
您可以存储:
(string)ViewData["Positions"]};
在页面上的隐藏标记中,然后像这样调用它
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Employee employeeToAdd, string Positions)
{
答案 1 :(得分:1)
在Create()(WITH POST ATTRIBUTE)员工中,因为未设置ViewData [“Positions”],您将收到此错误。这个值应该构成你的帖子请求的一部分,并且在post之后重新绑定应该从商店获取它,或者如果你需要重新绑定它,可以从session / cache获取它。
请记住,ViewData仅适用于当前请求,因此对于发布请求,尚未创建ViewData [“Positions”],因此会出现此异常。
你可以做一个快速测试...覆盖控制器的OnActionExecuting方法,并将逻辑放在那里获取位置,以便它始终可用。这应该针对每个动作所需的数据进行...这仅用于测试目的......
// add the required namespace for the model...
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// add your logic to populate positions here...
ViewData["Positions"] = new SelectList(from p in _positions.GetAllPositions() select p.Title);
}
可能还有其他干净的解决方案,也可能使用自定义模型绑定器......
答案 2 :(得分:0)
我认为ViewData用于将信息传递给您的View,但它不能反向运行。也就是说,不会从Request.Form
设置ViewData。我想你可能想要改变你的代码如下:
// change following
employeeToAdd.Position = new Position {Title = (string)ViewData["Positions"]};
// to this?
employeeToAdd.Position = new Position {Title = (string)Request.Form["Positions"]};
祝你好运!