2017-09-01 33 views
0

我有一个完成了几个部分的表单项目。例如。第1部分可能包含您的姓名,第2部分可能包含您的地址。后重定向 - 以长/向导样式表格获取模式

在MVC我有表示每个部件和一个模型的若干视图,以容纳所有表单数据。

我想在每个部分完成保存表单数据,并检索下一个部分保存的记录(使整个模型可在每个阶段)。

我使用后重定向消息获得,以避免“形式可以重新提交”使用前进和后退按钮浏览器的警告。

控制器代码

[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丢失它打破。

我已经考虑在会话存储这也许,但真的不希望把HttpContext发挥,如果我没有进行测试的原因。

是否有推荐的方法来实现这种事情?任何想法,以不同的方式来跟踪当前的记录将不胜感激。

+0

你可以考虑一个cookie(如果'id'是'null',请检查cookie的值)。而且您还可以添加当前步骤以允许用户注销并稍后返回完成(并在最后一步中将其删除) –

回答

1

您可以使用TempData或Session在请求之间传递数据。

我想创建一个大的类/对象从向导中的所有领域,把它扔到了会议如关键“MyWizardData”,并在向导的其他部分进行检索。

//保存/更新实体

你的ID,把它扔到了会议,并抓住它回到了下一个动作。

如果你不想使用会话,拿到编号后保存/更新,并将其存储在一个字段在用户表的数据库。或者只存储UserId和你创建的实体行。然后你可以在任何行动中抓住它。