基本对象数据在帖子 + 编辑器模板 + 相关模型上丢失
本文关键字:模型 编辑器 对象 数据 | 更新日期: 2023-09-27 18:31:33
我有以下型号
工厂可以有多辆汽车,一辆汽车可以有A型和B型
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;}
}
在编辑器模板中显示
以下内容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();
编辑器模板:即 - 为了保持简短,我省略了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
}
与工厂对象相关的所有数据都将丢失,其他模型数据除外 - (汽车、类型 A、类型 B)我该怎么做才能解决这个问题?
任何 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>
注意:隐藏类型的输入仅用于在HTTP POST中传回数据。没有它,MVC 引擎将无法使用所有相关详细信息重建Factory
对象。