ASP.NET MVC3,为什么dropdownlist甚至在强类型视图中依赖于viewbag

时间:2011-08-16 08:30:46

标签: asp.net-mvc asp.net-mvc-3 c#-4.0 drop-down-menu strongly-typed-view

我是MVC的新手,所以也许这是一个愚蠢的问题 - 我正试图了解asp.net mvc中的强类型视图。我正在开发第3版。 如果我有一个包含2个模型的项目 - 比如人和部门。一个人必须属于一个部门。所以我有我的部门模型(我已经生成了我的控制器和CRUD界面):

public class Department
{
    public int Id { get; set;}
    public string DeparmentName { get; set;}
}

然后我有一个参考Department的人员模型:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public int Department_Id { get; set; }
    [ForeignKey("Department_Id")
    public virtual Department Department { get; set;}
}

现在我生成我的控制器和视图。现在,当我查看PersonController时,我对Create:

有以下内容
public ActionResult Create()
{
    ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName");
    return View();
}

在Person \ Create.cshtml中,创建Department下拉列表的代码是

@Html.DropDownList("Department_Id", String.Empty)

据我所知,DropDownList Html助手正在使用ViewBag来创建我的下拉列表。但是,FirstName和LastName似乎在不依赖ViewBag的情况下创建了输入字段 - 所以在我的View中,我可以对我的FirstName和LastName字段进行编译时检查,因为我的视图是强类型的,但不在我的DropDownList上。

有没有理由为部门的DropDownList没有强烈输入或者我做错了什么并且有办法让它强烈输入?

谢谢:)

2 个答案:

答案 0 :(得分:5)

您需要一个视图包的原因是因为您的视图绑定的Person实例没有所有可能部门的数据,只有它所属的一个部门。这一行会发生什么:

ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName");

是否所有来自数据库的部门都被添加到选择列表(用于DropDown绑定),其中Id为关键字,而DepartmentName为值。在您的视图绑定到Person之后,下拉列表将显示相应的Department。

答案 1 :(得分:2)

如果您使用强类型视图,则应该将一个强类型模型传递给视图:

public class ViewData {
   public IList<Departments> Departments {get; set;}
}

然后在你的控制器中你有:

public ActionResult Create()
{
    ViewData model = new ViewData();
    model.Departments = db.Deparments;
    return View(model);
 }

最后一步是创建选择列表并在视图上下拉:

@model ViewData
@SelectList list = new SelectList(Model.Deparments, "Id", "DepartmentName");
@Html.DropDownList("Department_Id", list);

希望这是有道理的。