post + Editortemplate +相关模型丢失了baseObject数据

时间:2014-11-21 14:11:03

标签: c# asp.net-mvc entity-framework

我有以下型号

工厂可以有多辆汽车,一辆汽车可以有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) 我该怎么做才能解决这个问题?

1 个答案:

答案 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对象。

相关问题