不要将 db 模型直接传递给您的视图。您很幸运能够使用 MVC,因此请使用视图模型进行封装。
像这样创建一个视图模型类:
public class EmployeeAddViewModel
{
public Employee employee { get; set; }
public Dictionary<int, string> staffTypes { get; set; }
// really? a 1-to-many for genders
public Dictionary<int, string> genderTypes { get; set; }
public EmployeeAddViewModel() { }
public EmployeeAddViewModel(int id)
{
employee = someEntityContext.Employees
.Where(e => e.ID == id).SingleOrDefault();
// instantiate your dictionaries
foreach(var staffType in someEntityContext.StaffTypes)
{
staffTypes.Add(staffType.ID, staffType.Type);
}
// repeat similar loop for gender types
}
}
控制器:
[HttpGet]
public ActionResult Add()
{
return View(new EmployeeAddViewModel());
}
[HttpPost]
public ActionResult Add(EmployeeAddViewModel vm)
{
if(ModelState.IsValid)
{
Employee.Add(vm.Employee);
return View("Index"); // or wherever you go after successful add
}
return View(vm);
}
然后,最后在您的视图中(您可以先使用 Visual Studio 构建它),将继承的类型更改为 ShadowVenue.Models.EmployeeAddViewModel。此外,在下拉列表所在的位置,使用:
@Html.DropDownListFor(model => model.employee.staffTypeID,
new SelectList(model.staffTypes, "ID", "Type"))
同样对于性别下拉列表
@Html.DropDownListFor(model => model.employee.genderID,
new SelectList(model.genderTypes, "ID", "Gender"))
根据评论更新
对于性别,如果您在上述建议的视图模型中没有genderTypes,您也可以这样做(不过,再想一想,也许我会在视图模型中将此服务器端生成为IEnumerable)。因此,代替new SelectList...
下面,您将使用您的 IEnumerable。
@Html.DropDownListFor(model => model.employee.genderID,
new SelectList(new SelectList()
{
new { ID = 1, Gender = "Male" },
new { ID = 2, Gender = "Female" }
}, "ID", "Gender"))
最后,另一个选项是查找表。基本上,您保留与查找类型相关联的键值对。一种类型的一个例子可能是性别,而另一个可能是状态,等等。我喜欢这样构造我的:
ID | LookupType | LookupKey | LookupValue | LookupDescription | Active
1 | Gender | 1 | Male | male gender | 1
2 | State | 50 | Hawaii | 50th state | 1
3 | Gender | 2 | Female | female gender | 1
4 | State | 49 | Alaska | 49th state | 1
5 | OrderType | 1 | Web | online order | 1
我喜欢在一组数据不经常变化,但仍需要不时枚举时使用这些表。
希望这可以帮助!