一个创建视图中的两个数据源

时间:2009-09-03 03:00:32

标签: asp.net-mvc view controller

这就是我的数据模型类:

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'."

我很确定我做错了。填充下拉框的正确方法是什么?

3 个答案:

答案 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"]};
祝你好运!