在我的ChefInput ViewModel中,我有:
public class ChefInput : Input <-- base class has Id property
{
public int PersonId { get; set; }
public Person Person { get; set; }
}
在我的Person域类中,我有:
public class Person : DelEntity <-- base class has Id property
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
在Chef Create /(也编辑)视图中我有:
@Html.HiddenFor(x => x.Id) <-- Id comes from Input base class
@Html.TextBoxFor(x => x.PersonId) <- Just here to see if Id shows up in form
@Html.EditorFor(x => x.Person, "Common/Person")
在我的自定义Person EditorTemplate(EditorTemplates'文件夹的'Common'子文件夹)中,我有:
<div class="efield" style="width: 100%;">
<div class="elabel_left">First Name:</div>
@Html.TextBoxFor(x => x.FirstName, new { @class = "einput" })
@Html.ValidationMessageFor(x => x.FirstName)
</div>
<div class="efield" style="width: 100%;">
<div class="elabel_left">Last Name :</div>
@Html.TextBoxFor(x => x.LastName, new { @class = "einput" })
@Html.ValidationMessageFor(x => x.LastName)
</div>
我的厨师控制器完全不受ProDinner的影响:
public class ChefController : Cruder<Chef, ChefInput>
{
public ChefController(ICrudService<Chef> s, IMapper<Chef, ChefInput> v) : base(s, v)
{ }
}
结果:
观察:
在调试时,在(获取)编辑方法的Crudere文件中,对于这行代码:
var entity = CrudSvc.Get(id);
我的调试器显示: PERSONID:1 人:null
再次使用呈现的编辑页面,其中包含两个用于名/姓的空文本框。
最终评论:
我知道我可以为Person类型为Chef创建原始类型,但我想减少代码,我改变的ProDinner应用程序可能想在其他类(例如用户/主机等)上使用那些Person类型,所以对我来说正确的事情将所有共性隔离到一个类,只是将它们嵌套在相应的视图模型中。
如果你知道一个解决方案,请回答假设我绝对是非专家。所以请,没有简洁的评论,或链接到其他网站。如果你认为我做错了什么,我尊重你给我打电话,但请跟进一个更好的方法的例子。
谢谢。
PS:我已经承诺使用ProDinner的依赖结构,因此可以理解该框架内的解决方案。