0

我正在使用 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]TempDataSession等相关的各种事情OutputCache,包括刷新页面和持久化数据,但找不到任何正确的东西。

唯一有意义的是在return调用中,它发生在特定的所有内容之后ActionResult。我不知道这是否正确,但在这种情况下,页面刷新会导致所有输入的数据消失是有道理的,因为模型直到最后才被击中。但是,如果这就是问题所在,我无法弄清楚如何在不破坏已有代码的情况下解决它。

我很感激任何指导。

PS MVC 4 没有标签,所以我只选择了 MVC 和 MVC 3。

4

1 回答 1

0

问题出在 TempData 上。存储在其中的数据仅适用于单个请求,在您的情况下是重定向。

第一种可能性是在 TempData 中将数据保留更长时间:

...
else
{
    myData = (MyData)TempData["myData"] ?? new MyData();
    TempData.Keep();
}

哪个更将其同化为 Session。所以你可以使用 Session 而不是 TempData。

另一种解决方案是将每个步骤的数据存储在数据库中的某个临时表中,以便您可以在每个步骤中检索它。我猜你在每一步都有这个问题,不仅仅是在最后一个显示摘要。无论如何,如果您只关心最后一步,为什么不将数据保存到数据库中呢?

于 2012-04-05T06:02:18.487 回答