我有以下型号
工厂可以有多辆汽车,一辆汽车可以有TypeA&的TypeB
public class Factory
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FactoryID {get;set;}
//Insert properties here like Name, Location etc.
public ICollection<Car> Cars {get;set;}
}
public class Car
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CarID {get;set;}
public int FactoryID {get;set;}
public Factory Factory {get;set;}
//The Types
public TypeA TypeA {get;set;}
public TypeB TypeB {get;set;}
}
public class TypeA
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TypeAID {get;set;}
[Key, ForeignKey("Car")]
public int CarID {get;set;}
public Car Car {get;set;}
}
public class TypeB
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TypeBID {get;set;}
[Key, ForeignKey("Car")]
public int CarID {get;set;}
public Car Car {get;set;}
}
使用以下
在EditorTemplate中显示Factory factory = Factory factory = db.Factory.Where(f => f.FactoryID == 1)
.Include(f => f.Cars.Select(c => c.TypeA))
.Include(f => f.Cars.Select(c => c.TypeB)).FirstOrDefault();
EditorTemplate:ie - 我为了保持简短而省略了div和标签
@model project.Car
@Html.HiddenFor(m => m.Factory.FactoryID)
@Html.HiddenFor(m => m.FactoryID)
@Html.HiddenFor(m => m.CarID)
@Html.HiddenFor(m => m.TypeA.TypeAID)
@Html.HiddenFor(m => m.TypeB.TypeBID)
@Html.TextBoxFor(m => m.CarDataA)
@Html.TextBoxFor(m => m.CarDataB)
@Html.TextBoxFor(m => m.TypaA.TypeAData)
@Html.TextBoxFor(m => m.TypaB.TypeBData)
我只是发布模型进行查看,依此类推。然后是时候将数据发布回模型了。
RootView:再次删除
@model project.Factory
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div>
@Html.EditorFor(model => model.Cars, new { TypeList = ViewBag.TypeList })
</div>
<div>
<input type="submit" value="Save">
</div>
}
我的帖子
[HttpPost]
public ActionResult FactoryEdit(Factory factory)
{
if(ModelState.IsValid)
{
db.entry(factory).State = EntityState.Modified;
db.SaveChanges();
//Redirect
}
//Return view
}
除了其他模型数据外,与Factory对象相关的所有数据都将丢失 - (Car,TypeA,TypeB) 我该怎么做才能解决这个问题?
答案 0 :(得分:1)
回到操作方法的任何POST都只包含您明确指定的数据。您拥有的编辑器模板正确地执行了此操作,但您还需要传递“根”级别的值。
通常使用HiddenFor / DisplayFor / EditorFor帮助程序完成。其中每个都在页面上创建一个HTML input
标记,该标记包含在表单数据中。因此,在基本视图中,您需要包含您需要传回的任何值。例如,简化版本可能如下所示:
@model project.Factory
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.FactoryID )
@Html.EditorFor(model => model.Cars)
}
这基本上会给你这样的HTML输出:
<form ....>
<input ID='FactoryID' type='hidden' value='123'>
<input ID='CarID' type='hidden' value='123'>
<input ID='CarDataA' type='hidden' value='Ford'>
</form>
注意:hidden类型的输入仅用于在HTTP POST中传回数据。没有它,MVC引擎无法使用所有相关细节重建您的Factory
对象。