需要在每一步保存数据的简单向导

时间:2015-07-29 15:45:41

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

在详细介绍之前,我只想总结一下我的目标。我想创建多个表单,其形式类似于带有下一个和上一个按钮的向导。我想在用户单击Next键时保存每个步骤的数据,这样我就不必在Session或隐藏字段中临时保存数据。我的数据库结构是这样的,我有一个主表,所有向导步骤都是主表的子。主表与子表有一对多的关系。主表没有任何与之关联的视图。请查看下面的详细信息,然后您可以建议一些指导方针并为我正在做的事情添加方向。

这可能不是很复杂,但作为实体Frmework和MVC的新手,我还没有找到实现它的方法。

假设我有四个简单的模型,

public class MainModel
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column(TypeName = "bigint")]
    public int ID { get; set; }

    public bool IsDeleted { get; set; }

    public Child1 Child1 { get; set; }

    public IEnumerable<Child2> Child2 { get; set; }
}

public class Child1
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column(TypeName = "bigint")]
    public int ID { get; set; }

    public string BioData { get; set; }

    public int MainModelID { get; set; }

    public MainModel MainModel { get; set; }
}

public class Child2
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column(TypeName = "bigint")]
    public int ID { get; set; }

    public string SomeOtherValue { get; set; }

    public int MainModelID { get; set; }

    public MainModel MainModel { get; set; }
}

我有两个关于Child1和Child2的视图。 MainModel没有任何视图,因为它没有任何需要从用户输入的字段。

在Controller中,我有以下方法,

[HttpGet]
public ActionResult Index()
{
        return View("Child1View", new Child1());
}

[HttpPost]
public ActionResult ProcessChild1(Child1 model)
{
        If (Model.IsValid)
        {
             // Save the Child1 model to the database
             // If it is first time the first MainModel needs to b saved
             // How to determine whether Child1 was already saved so that next time update it?
             // I don't want to use session or hidden fields to store complete objects because of size so I am saving each Child at each step
        }
}


[HttpGet]
public ActionResult Child2()
{
        return View("Child2View", new Child2());
}


[HttpPost]
public ActionResult ProcessChild2(Child2 model)
{
        If (Model.IsValid)
        {
             // Save the Child2 model to the database
             // As Child1 will be already saved so MainModel will be already created too but should I need to store MainModel in Session?
        }
}

现在请不要将此视为实际代码。这段代码只是为了让我知道我正在做什么以及到目前为止我做了什么,所以示例代码中几乎没有错误。我想要的是,当提交Child3View并调用ProcessChild1 Action方法时,然后创建MainModel并使用它插入Child1模型,并且相同的ProcessChild2 Action方法。我没有提到任何观点,因为这只是示例代码。

此外,我计划在视图上设置下一个和上一个按钮,以便我可以在Child1View和Child2View之间导航。这会产生另一个混淆,即第一次创建MainModel但是如果用户通过单击Previous按钮返回并再次单击Next则更新记录而不是插入记录。

如果有人在网上知道任何有关此事的例子,也会很棒。

1 个答案:

答案 0 :(得分:1)

  

如何确定Child1是否已经保存,以便下次使用   更新它?

您应该在@Html.HiddenFor(child1 => child1.Id)视图中看到Child1,并且应该转到ProcessChild1行动。如果model.Id == 0那么它就是新记录。

  

我是否需要在Session

中存储MainModel
{p>同样适用于MainModel。在您的视图中包含隐藏的MainModel.Id字段。确保在创建Child1.MainModel实体时填充Child2.MainModel属性或MainModel

[HttpPost]
public ActionResult ProcessChild1(Child1 model)
{
    if (Model.IsValid)
    {
        if (model.Id == 0)
        {
            //create MainModel
            var mainModel = new MainModel();
            //attach new Child1
            mainModel.Child1 = new Child1();
            //save changes
            context.MainModels.Add(mainModel);
            context.SaveChanges();
            model.MainModel = mainModel;
        }
        else
        { 
            //find Child1 by ID
            var Child1 = context.Child1.Find(model.Id);
            //update Child1
            //save changes
            model.MainModel = Child1.MainModel;
        }
        return View("Child2View", new Child2() { MainModel = model.MainModel }); 
    }
    return View("Child1View", model);
}