【问题标题】:Prevent Back Button in MVC防止 MVC 中的后退按钮
【发布时间】:2019-08-19 12:05:44
【问题描述】:

我正在制作一个可供多人依次使用的 Kiosk 应用程序。他们需要输入一些个人信息,甚至可能是一张信用卡。一旦他们按下“提交”,它将处理信息并将它们重定向到确认页面。

但是,我需要以某种方式完全禁用后退按钮,这样下一个用户就无法返回并获取上一个客户的信息。

在我的控制器中,我使用的是 return RedirectToAction() 而不是 return View()。如果客户按下后退按钮,这有助于页面不会重新提交,但不会清除表单。 我还尝试了以下变体:

window.history.forward();

这根本不起作用。当我让控制器返回 View() 时,此 JavaScript 阻止用户返回,但会闪烁前一页,因此您可以在重定向回当前视图之前看到大约一秒钟的信息。

如果这是我必须走的路线,我完全禁用整个应用程序的后退按钮没有问题。我只是不知道如何。我不赞成禁用后退按钮的想法;如果有其他解决方案可以做到这一点,我也可以尝试这些解决方案。

编辑: 有人问过类似的问题,但没有一个能解决这个问题。具体来说,该问题讨论了在注销发生时禁用返回(清除会话/清除现金/等)。对于我的问题,我无法清除会话,因为它会将供应商注销,并且需求文档明确指出供应商的会话将激活 8 小时,除非注销。

【问题讨论】:

标签: asp.net-mvc


【解决方案1】:

我从另一个来源得到了答案。

似乎最好的方法是改变状态的历史。

let stateObject = {
    object: "blah"
}

history.pushState(stateObject, "", "../Home/Index")

所以基本上,如果有人试图回到历史,浏览器会记住最后一页是(在这种情况下)/Home/Index,而不是您实际所在的任何页面。因此,后点击实际上会重定向回家。

我把它放在脚本部分的表单页面(不是确认页面)上。如果有人想查找历史记录,这也很有帮助。

【讨论】:

  • 这个!正是我需要的!我需要视图本身从浏览器历史记录中隐藏自己,而不是隐藏视图之前或之后的视图 - 这是其他答案处理它的方式!
【解决方案2】:

您可以尝试阻止文件被缓存。

    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    response.setHeader("Pragma", "no-cache");
    response.setDateHeader("Expires", 0);

如果用户按下后退按钮,它将调用您的控制器,然后您将拥有更多控制器来控制所看到的内容。

【讨论】:

  • 我会把它放在确认页面上,还是我不想让他们返回的页面上?
  • 避免使用 jquery 在浏览器历史记录中添加每个导航。
  • @HumanHickory 你把这个添加到你不想缓存信息的所有页面上。
【解决方案3】:

在您的 Global.asax

中添加以下内容
     protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }

我们需要将上述脚本放置在页面的标题部分中,以防止用户使用浏览器后退按钮导航回另一个页面。 在这里,此 JavaScript 功能将在所有浏览器中工作,并防止用户通过点击浏览器后退按钮检查以下 JavaScript 代码来导航回上一页。

<script type="text/javascript" language="javascript">
     function DisableBackButton() {
       window.history.forward()
      }
     DisableBackButton();
     window.onload = DisableBackButton;
     window.onpageshow = function(evt) { if (evt.persisted) DisableBackButton() }
     window.onunload = function() { void (0) }
 </script>

【讨论】:

  • 所以我不能做的一件事就是放弃或清除会话。供应商将登录信息亭,他们的客户将填写表格。清除会话会注销供应商,这是需求文档的特定部分。不过,这是个好主意!谢谢!
【解决方案4】:

禁用浏览器后退按钮脚本

以下 JavaScript 代码 sn-p 必须放在 View 的 HEAD 部分中,必须防止用户返回。

<script type = "text/javascript" >
   function preventBack(){window.history.forward();}
    setTimeout("preventBack()", 0);
    window.onunload=function(){null};
</script>

在 ASP.Net MVC 中禁用浏览器后退按钮实现

登录查看

登录视图的 HTML 标记由指向主视图的 HTML 锚链接组成。 禁用浏览器后退按钮脚本放置在 HEAD 部分,因此用户无法使用主页视图中的浏览器后退按钮访问登录视图。

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width"/>
    <title>Login</title>
    <script type="text/javascript">
        function preventBack() { window.history.forward(); }
        setTimeout("preventBack()", 0);
        window.onunload = function () { null };
    </script>
</head>
<body>
    <h3>Login</h3>
    <hr/>
    <a href="/Home/Home">Redirect to Home</a>
</body>
</html>

主页视图

主页视图的 HTML 标记包含一个指向登录视图的 HTML 锚链接。

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width"/>
    <title>Home</title>
</head>
<body>
    <h3>Home</h3>
    <hr/>
    <a href="/Home/Login">Redirect to Home</a>
</body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2012-04-27
    • 2010-09-08
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多