我有一个项目,其表格已经完成了几个部分。例如。第1部分可能包括您的姓名,第2部分可能包含您的地址。
在MVC中,我有几个视图代表每个部分,一个模型用于保存所有表单数据。
我想在每个部分完成时保存表单数据,并在下一部分检索已保存的记录(这样整个模型在每个阶段都可用)。
我正在使用Post-Redirect-Get以避免重新提交表单'来自浏览器的警告使用后退和前进按钮。
控制器代码
[HttpGet]
[Route("Form/Part/{id}")]
public ActionResult Part(int id, int? recordId)
{
var model = new MyVM();
if(recordId.HasValue) {
// get record from DB
// map record to 'model'
}
return View("Form.{id}", model);
}
[HttpPost]
[Route("Form/Part/{id}")]
public ActionResult Part(int id, MyVM model)
{
// map model to entity
// save/update entity
return RedirectToAction($"Form/Part/{id + 1}", new { recordId = recordId })
}
我的问题是如何最好地保留新创建/更新记录的ID并将其传递给下一个表单部分。
虽然将recordId
作为routeValue
传递,但当我使用浏览器后退按钮时它会中断,因为查询字符串中的recordId
会丢失。< / p>
我考虑将这个存储在会话中,但如果我不是出于测试原因,我并不想将HttpContext
置于其中。
有没有推荐的方法来实现这种目的?任何关于跟踪当前记录的各种方法的想法都将受到高度赞赏。
答案 0 :(得分:1)
您可以使用TempData或Session在请求之间传递数据。
我将使用向导中的所有字段创建一个大类/对象,将其放入会话中,例如key&#34; MyWizardData&#34;并在向导的其他部分检索它。
在
//保存/更新实体
你有这个ID,把它扔进会话并在下一个动作中抓住它。
如果您不想使用会话,请在保存/更新后获取ID,并将其存储在用户表中数据库的字段中。或者只是将UserId与您创建的实体行一起存储。然后你可以在任何动作中抓住它。