我正在教自己asp .net mvc3。我已经研究了很多但是我读的越多,我变得越困惑。我想创建一个页面,用户可以在其中注册出售或出租物业。
我创建了一个如下所示的数据库:
public class Property
{
public int PropertyId { get; set; }
public int PropertyType { get; set; }
···
public int Furnished { get; set; }
...
}
现在,我想要dropdownlistfor = PropertyType和Furnished。
属性类型将是 1平 2楼 3独立式住宅 ...
家具将是: 1家具 2 UnFurnished 3 PartFurnished ...
现在,我真的不确定在我的代码中将这些信息保存在哪里。我的数据库中是否应该有2个存储此查找的表?或者我应该有一个包含所有查找的表吗?或者我应该将此信息保留在模型中吗?
模型如何在Property实体中绑定PropertyType和Furnished?
谢谢!
答案 0 :(得分:2)
通过在数据库中存储属性类型和提供的类型,您可以使用外键强制数据完整性,而不是仅存储整数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)
答案 1 :(得分:0)
我通常通过在代码中使用枚举来处理这种情况:
public enum PropertyType {
Flat = 1,
House = 2,
Detached House = 3
}
然后在你看来:
<select>
@foreach(var val in Enum.GetNames(typeof(PropertyType)){
<option>val</option>
}
</select>
您可以将选项的ID设置为枚举中每个项目的值,并将其传递给控制器。
编辑:直接回答您的问题: 您可以将它们存储为数据库中的查找,但对于不太可能改变的东西,我通常只使用枚举,并保存往返。
另外看看这种方法,因为它看起来比我的好: Converting HTML.EditorFor into a drop down (html.dropdownfor?)