刷新页面重置输入 - 是否可以避免这种情况?

时间:2012-04-04 12:43:50

标签: asp.net-mvc asp.net-mvc-3 serialization controller

我正在使用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]TempDataSessionOutputCache等相关的各种事情,包括刷新页面和坚持数据但无法找到任何关键点。

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

我感谢任何指导。

P.S。 MVC 4没有标签所以我只选择了MVC和MVC 3。

1 个答案:

答案 0 :(得分:0)

TempData的问题。存储在内部的数据仅存在于单个请求中,在您的情况下是重定向。

第一种可能性是在TempData中保持更长的数据:

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

哪一种更能吸收它到Session。所以你可以使用Session而不是TempData。

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