我正在使用 MVC 4 和 MVC Futures[Serializable]
功能通过多步骤向导来保存数据。向导本身只是从用户那里收集信息,然后根据这些输入生成自动响应。我不需要将输入永久存储到数据库中。
现在,我遇到了一个可以在向导的“确认”页面上处理的问题,但我想知道是否可以避免这样做的需要。我的问题是,如果用户点击“刷新/F5”(你知道他们会这样做)他们在特定步骤上的所有输入,并且所有先前的步骤都将被删除。如果他们在确认之前处于最后一步,他们将不会意识到他们已经清除了他们在先前步骤中输入的所有内容。处理这个问题的方法是在确认页面上放置一个验证摘要,然后显示每个输入都需要重做。这带来了一个问题,因为它破坏了用户体验(他们必须返回所有步骤并重新输入)。
这是我的控制器代码示例:
//This is the serialization:
private MyData myData;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var serialized = Request.Form["myData"];
if (serialized != null) //Form was posted containing serialized data
{
myData = (MyData)new MvcSerializer().Deserialize(serialized, SerializationMode.Signed);
TryUpdateModel(myData);
}
else
myData = (MyData)TempData["myData"] ?? new MyData();
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (filterContext.Result is RedirectToRouteResult)
TempData["myData"] = myData;
}
...
//This shows a mid-step in the wizard - only as an example:
public ActionResult Step2(string backButton, string nextButton)
{
if (backButton != null)
return RedirectToAction("Step1");
else if ((nextButton != null) && ModelState.IsValid)
return RedirectToAction("Step3");
else
return View("Step2", myData);
我昨天和今天早上一直在研究与[Serializable]
、TempData
、Session
等相关的各种事情OutputCache
,包括刷新页面和持久化数据,但找不到任何正确的东西。
唯一有意义的是在return
调用中,它发生在特定的所有内容之后ActionResult
。我不知道这是否正确,但在这种情况下,页面刷新会导致所有输入的数据消失是有道理的,因为模型直到最后才被击中。但是,如果这就是问题所在,我无法弄清楚如何在不破坏已有代码的情况下解决它。
我很感激任何指导。
PS MVC 4 没有标签,所以我只选择了 MVC 和 MVC 3。