MVC4 - 如何为编辑视图

时间:2015-06-28 07:06:04

标签: asp.net-mvc asp.net-mvc-4

我似乎无法弄清楚如何使用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>

现在,以下是我的问题 -

  1. 是否可以使用自动脚手架功能生成可以自动获取模型中模型的集合属性的创建/编辑视图?
  2. 即使编辑视图仅满足PrimaryKeyTable的编辑,但对于ForeignKeyCollection,它将执行所有创建,编辑和删除操作。在这种情况下,控制器会是什么样子?
  3. 我正在考虑创建一个基本上重新创建模型类的ViewModel。然后在View中,我可能会在hanselman的ASP.NET Wire Format方法之后编写HTML。考虑到我的大部分模型都有这样的关系(有些关系深入2-4级),它仍然需要大量的工作。有没有更好的方法来自动化代码生成(猜测这可以追溯到如何使用脚手架)?
  4. 更新 - 我的解决方案(仍在寻找更优雅的东西) 我最终直接在模型上构建了视图。我意识到标准的做法似乎是在View和Model之间放置一个ViewModel,但我无法证明创建这些&#34; bridge&#34;每个模型的ViewModel类。

    备注 -

    1. 在添加新行时,似乎没有为ForeignKeyCollection的隐藏输入创建唯一索引的方法。我最终从一个大数字向后计数并使用计数作为索引。在控制器中,我通过使用相同的索引号来区分新行和旧行(例如,如果它超过100000,那么它是一个新行等)。
    2. 似乎没有办法识别客户端中删除的ForeignKeyCollection行。因此,在删除事件上,我最终将其中一个属性更改为&#34; *** DELETED&#34;文本然后在Controller中使用它来删除它们。
    3. 我的控制器看起来像 -

      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级深度的外键关系做到这一点!

0 个答案:

没有答案