简单的向导,需要在每一步保存数据
本文关键字:每一步 保存 数据 向导 简单 | 更新日期: 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);
}