重定向后 - 以长/向导样式表单获取模式

时间:2017-09-01 08:06:52

标签: asp.net-mvc asp.net-mvc-5 post-redirect-get

我有一个项目,其表格已经完成了几个部分。例如。第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置于其中。

有没有推荐的方法来实现这种目的?任何关于跟踪当前记录的各种方法的想法都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

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

我将使用向导中的所有字段创建一个大类/对象,将其放入会话中,例如key&#34; MyWizardData&#34;并在向导的其他部分检索它。

  

//保存/更新实体

你有这个ID,把它扔进会话并在下一个动作中抓住它。

如果您不想使用会话,请在保存/更新后获取ID,并将其存储在用户表中数据库的字段中。或者只是将UserId与您创建的实体行一起存储。然后你可以在任何动作中抓住它。