ASP.NET MVC Web应用程序中的后退按钮问题

时间:2012-10-13 23:16:53

标签: javascript asp.net-mvc browser

这是一个难以解释的问题。

让我来形容一个场景。

  1. 我有主页,注册页面,登录页面和仪表板页面
  2. 当我从注册页面注册申请并点击提交时。应用程序将处理请求,并在用户登录时将我重定向到Dashbord。现在,问题来了。当我按回按钮。我得到注册页面,其中的字段由值填充。这不应该发生。
  3. 当我登录系统时,从仪表板上回来浏览器。它会显示我的登录页面。这也不应该发生。
  4. 我希望它能说明我在寻找什么。

    我尝试过几个可能的解决方案:

    1. 使用代理页面。与许多邮件服务正在做的类似。但是在MVC 3中它不会检测到页面加载事件,并且页面上的控制非常少。
    2. 在代理页面window.history.forward()
    3. 上使用javascript函数
    4. 一旦呈现过期代理页面。
    5. 我并不完全相信上述解决方案。我希望能够以系统的方式获得一些最佳实践,并以优雅的方式解决问题。

      请帮助我提供有关我正在使用的现有解决方案的建议,以及您是否有一些出色的工作解决方案。请分享。

      全部谢谢。

      仅供参考。我正在使用ASP.NET MVC 4进行开发。

2 个答案:

答案 0 :(得分:0)

使用history.js来控制history.back()事件。您只需将最后一页的状态替换为指向仪表板或所需页面(在您的Web应用程序内;出于安全原因,禁止跨域)。当用户单击后退按钮时,将加载定义的页面而不是登录页面。

https://github.com/browserstate/History.js/

代理解决方案对于这种UI交互来说太复杂了。客户端控制是解决方案的最佳方法。 HTML5参考为其定义了History API(http://www.w3.org/TR/html5/history.html)。不幸的是,现在并非所有的浏览器都能实现它那是因为history.js脚本存在。

答案 1 :(得分:0)

在寄存器和登录页面的Controller / Action方法中,检查用户是否已登录并重定向到例如。仪表板。

这样的事情取决于您的身份验证方式。

public ActionResult Register()
{
  //If already logged in no need to show register page again
  if(Request.IsAuthenticated)
    return Redirec("Dashboard");

  return View();
}

编辑:更新了修复评论问题的答案

我创建了一个包含以下内容的部分视图

<input type="hidden" id="reloader" value="" />
<script type="text/javascript">
  if (document.getElementById("reloader").value === "reload")
      window.location.reload();
  else
      document.getElementById("reloader").value = "reload"
</script>

然后,您可以在注册和登录视图中包含@Html.Partial('PartailViewName')

由于在使用后退按钮时缓存了DOM,如果用户使用后退按钮,上面的脚本将重新加载页面。

如果与我的第一个答案一起使用,您将获得所需的行为。