我是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没有强烈输入或者我做错了什么并且有办法让它强烈输入?
谢谢:)
答案 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);
希望这是有道理的。