我似乎无法弄清楚如何使用scaffolding为包含另一个类(外键表)的集合的模型类创建Edit视图。请参阅下面简化的模型类 -
<code>
public class PrimaryKeyTable {
public int PrimaryKeyId {get;set}
public ICollection<ForeignKeyTable> ForeignKeyCollection {get;set;} //Each item in the collection maps to a row in the foreign key table in database
}
public class ForeignKeyTable {
public int PrimaryKeyId {get;set} //This links it back to PrimaryKey Class
public int ForeignKeyId {get;set}
public string Prop1 {get;set;}public string Prop2 {get;set;} //and so on
}
</code>
现在,这很多都是由实体模型自动创建的。我想创建一个强类型的Edit视图,它将PrimaryKeyTable作为Model,并允许编辑ForeignKeyCollection。我可以循环并为ForeignKeyCollection创建一个可编辑的表,但它永远不会回发编辑的值。
以下是简化视图 -
<code>
@model DBModels.PrimaryKeyClass
@using (Html.BeginForm()) {
@Html.EditorFor(model => model.PrimaryKeyId)
<table>//The table will also have jquery to add/delete rows
@foreach (var foreignKey in Model.ForeignKeyCollection) {
//Removed table generation html stuff
<td>@Html.EditorFor(model => foreignKey.Prop1)</td>
//Also tried replacing the above with indexed names
}}
</code>
简化控制器 -
<code>
public ActionResult Edit(PrimaryKeyTable primaryKeyTable) {
if (ModelState.IsValid) {
db.Entry(lookuptable).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(primaryKeyTable);
}
</code>
现在,以下是我的问题 -
更新 - 我的解决方案(仍在寻找更优雅的东西) 我最终直接在模型上构建了视图。我意识到标准的做法似乎是在View和Model之间放置一个ViewModel,但我无法证明创建这些&#34; bridge&#34;每个模型的ViewModel类。
备注 -
我的控制器看起来像 -
public PartialViewResult CRUDTest(PrimaryKeyTable primaryKeyTable) {
if (ModelState.IsValid) {
db.Entry(primaryKeyTable).State = EntityState.Modified;
foreach (var fk in primaryKeyTable.ForeignKeyCollection.ToList()) {
if (fk.ForeighKeyId < 100000) {
if (fk.Prop1 == "***DELETED")
db.Entry(fk).State = EntityState.Deleted;
else
db.Entry(fk).State = EntityState.Modified;
}
else
db.Entry(fk).State = EntityState.Added;
}
db.SaveChanges();
}
return....
}
不是最干净的代码,但我似乎找不到任何真正优雅的解决方案。我担心不得不为4-5级深度的外键关系做到这一点!