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

Ric*_*ick 6 asp.net-mvc strongly-typed-view c#-4.0 asp.net-mvc-3 drop-down-menu

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

public class Department
{
    public int Id { get; set;}
    public string DeparmentName { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个引用Department部门的Person模型:

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;}
}
Run Code Online (Sandbox Code Playgroud)

现在我生成我的控制器和视图.现在,当我查看PersonController时,我对Create有以下内容:

public ActionResult Create()
{
    ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName");
    return View();
}
Run Code Online (Sandbox Code Playgroud)

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

@Html.DropDownList("Department_Id", String.Empty)
Run Code Online (Sandbox Code Playgroud)

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

有没有理由为部门DropDownList没有强烈输入或我做错了什么并且有一种方法可以强力输入?

谢谢 :)

Edw*_*ing 5

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

ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName");
Run Code Online (Sandbox Code Playgroud)

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