假设我有以下课程(您是否也可以考虑我的课程在该关系部分方面是否正确):
public class EFDbContext : DbContext
{
public DbSet<Project> Projects { get; set; }
public DbSet<Address> Addresses { get; set; } // *
public DbSet<Country> Countries { get; set; } // *
// Custom model builder bindings for * coz of the plural issue with EF
}
public class Project
{
public int ProjectID { get; set; }
public string Name { get ; set; }
public int AddressID { get; set; } // Database relation column
public Address Address { get ; set; }
}
public class Address
{
public int AddressID { get; set; }
public string Address1 { get ; set; }
public string Address2 { get ; set; }
public int CountryID { get; set; } // Database relation column
public Country Country { get ; set; }
}
public class Country
{
public int CountryID { get; set; }
public string Name { get; set; }
}
我将如何为此做剃刀......
我的“创建项目”页面需要一个看起来像这样的表格......但这不正确吗?
@model Project
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address)
</div>
</div>
所以我最终创建了一个Shared/EditorTemplates/Address.cshtml
,然后构建了地址表单:
@model Address
<div class="form-group">
@Html.LabelFor(model => model.Address1, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address1)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Address2, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Address2)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Country, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Country)
</div>
</div>
最后是Country one ...哪个需要输入一个类型(所以有些自定义类添加到editorfor
,你不能这样做,我做textbox
) - Shared/EditorTemplates/Country.cshtml
< / p>
@model Country
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBox("", Model.Name.ToString(), new { @class = "countries typeahead" })
</div>
</div>
这看起来是否正确?我发现它非常压倒性和令人困惑(顺便说一下,我已经尝试了这个并且它不起作用......但如果我知道这是正确的方法,那么我可以朝这个方向继续前进)!
答案 0 :(得分:1)
你走在正确的轨道上。只需注意将EditorTemplates放置在项目结构中的位置以及如何引用它们。 MVC惯例并不总是以您希望的方式工作,例如当模型包含在列表中时,使用单个模型的编辑器模板。
我的一个建议是为传递给剃刀视图的模型使用完全独立的“视图模型”。您可以使用像automapper这样的东西在视图模型和实体框架模型(也称为数据模型)之间进行映射。为什么?随着时间的推移,你会发现他们需要不同的东西,例如:模型属性的mvc属性。