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

本文关键字:每一步 保存 数据 向导 简单 | 更新日期: 2023-09-27 18:05:18

在进入细节之前,我只想总结一下我要做的事情。我想创建多个表单,就像一个向导与下一步和上一个按钮。我希望在用户单击Next键时保存每一步的数据,这样我就不必在Session或隐藏字段中临时保存数据。我的数据库结构是这样的,我有一个主表和所有的向导步骤是主表的子。主表与子表有一对多的关系。主表没有与之关联的任何视图。请看看下面的细节,如果你可以建议一些指导方针,并为我正在做的事情添加方向。

这可能不是很复杂,但作为新的实体框架和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没有任何视图,因为它没有任何需要从用户处获取输入的字段。

在控制器中,我有以下方法,

[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,则记录被更新而不是插入。

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

如果有人知道关于这个的任何在线例子,那将是伟大的。

如何确定Child1是否已经保存,以便下次更新了吗?

你应该有一个@Html.HiddenFor(child1 => child1.Id)在你的Child1视图,它应该被传递到ProcessChild1行动。如果是model.Id == 0,则是一个新记录。

我是否需要在会话

中存储MainModel

同样适用于MainModel。在视图中包含一个隐藏的MainModel.Id字段。确保在创建MainModel实体时填充Child1.MainModel属性或Child2.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);
}