基本对象数据在帖子 + 编辑器模板 + 相关模型上丢失

本文关键字:模型 编辑器 对象 数据 | 更新日期: 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对象。