通过在数据库中存储属性类型和提供的类型,您可以使用外键强制数据完整性,而不仅仅是存储整数 id,所以我肯定会推荐这个。
这也意味着如果您想添加新类型,它是面向未来的。我知道这些值不会经常改变/永远不会改变,但如果您想在将来添加平房/别墅,您不必重建和部署您的项目,您可以简单地在数据库中添加一个新行。
就其工作方式而言,我建议使用传递给视图的 ViewModel,而不是直接传递数据库模型。这样您就可以将数据库模型与视图分开,而视图只看到它需要的内容。这也意味着您的下拉列表等是强类型的,并且直接在您的视图模型中,而不仅仅是放入 ViewBag 中。您的视图模型可能如下所示:
public class PropertyViewModel
{
public int PropertyId { get; set; }
public int PropertyType { get; set; }
public IEnumerable<SelectListItem> PropertyTypes { get; set; }
public int Furnished { get; set; }
public IEnumerable<SelectListItem> FurnishedTypes { get; set; }
}
那么您的控制器操作将如下所示:
public class PropertiesController : Controller
{
[HttpGet]
public ViewResult Edit(int id)
{
Property property = db.Properties.Single(p => p.Id == id);
PropertyViewModel viewModel = new PropertyViewModel
{
PropertyId = property.Id,
PropertyType = property.PropertyType,
PropertyTypes = from p in db.PropertyTypes
orderby p.TypeName
select new SelectListItem
{
Text = p.TypeName,
Value = g.PropertyTypeId.ToString()
}
Furnished = property.Furnished,
FurnishedTypes = from p in db.FurnishedTypes
orderby p.TypeName
select new SelectListItem
{
Text = p.TypeName,
Value = g.FurnishedTypeId.ToString()
}
};
return View();
}
[HttpGet]
public ViewResult Edit(int id, PropertyViewModel propertyViewModel)
{
if(ModelState.IsValid)
{
// TODO: Store stuff in the database here
}
// TODO: Repopulate the view model drop lists here e.g.:
propertyViewModel.FurnishedTypes = from p in db.FurnishedTypes
orderby p.TypeName
select new SelectListItem
{
Text = p.TypeName,
Value = g.FurnishedTypeId.ToString()
};
return View(propertyViewModel);
}
}
你的观点会是这样的:
@Html.LabelFor(m => m.PropertyType)
@Html.DropDownListFor(m => m.PropertyType, Model.PropertyTypes)