Asp.net mvc MVC中的防止后退按钮

Asp.net mvc MVC中的防止后退按钮,asp.net-mvc,Asp.net Mvc,我正在制作一个多人可以一个接一个使用的Kiosk应用程序。他们需要输入一些个人信息,甚至可能是信用卡。一旦他们按下“提交”,它将处理信息并将其重定向到确认页面 但是,我需要以某种方式完全禁用“后退”按钮,以便下一个用户无法返回并获取上一个客户端的信息 在我的控制器中,我使用的是return RedirectToAction()而不是return View()。这有助于在客户端按下后退按钮但未清除表单时页面不会重新提交。 我还尝试了以下方面的变化: window.history.forward()

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

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

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

window.history.forward();
这根本不起作用。当我使用controller return View()时,此JavaScript阻止用户返回,但会闪烁上一页,以便在将其重定向回当前视图之前,您可以看到信息大约一秒钟

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

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

在您的Global.asax中添加以下内容

     protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }
我们需要将上面的脚本放在页面的页眉部分,以防止用户使用“浏览器后退”按钮导航回另一个页面。 在这里,此JavaScript功能将在所有浏览器中工作,并通过点击JavaScript代码下面的“浏览器后退”按钮来阻止用户导航回上一页


函数DisableBackButton(){
window.history.forward()
}
禁用BackButton();
window.onload=禁用BackButton;
window.onpageshow=函数(evt){if(evt.persisted)DisableBackButton()}
window.onunload=function(){void(0)}

您可以尝试阻止缓存文件

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

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

禁用浏览器后退按钮脚本

以下JavaScript代码片段必须放在视图的HEAD部分,必须防止用户返回

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

函数preventBack(){window.history.forward();}
setTimeout(“preventBack()”,0);
onunload=function(){null};

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

登录视图

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

@{
    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>
@{
布局=空;
}
登录
函数preventBack(){window.history.forward();}
setTimeout(“preventBack()”,0);
window.onunload=函数(){null};
登录

主视图

主视图的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>
@{
布局=空;
}
家
家


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

看来最好的办法就是改变这个国家的历史

let stateObject = {
    object: "blah"
}

history.pushState(stateObject, "", "../Home/Index")
因此,基本上,如果有人试图追溯历史,浏览器会记住最后一个页面是(在本例中)/主页/索引,而不是您实际所在的页面。因此,单击后退实际上会重定向回主页


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

可能是重复的感谢链接到它,但我在发布这篇文章之前检查了该页面,所有这些似乎都不起作用:-/因此,我唯一不能做的就是放弃或清除会话。供应商将登录信息亭,其客户将填写表格。清除会话将注销供应商,这是需求文档的一部分。这是个好主意!非常感谢。我会将其放在确认页面上,还是放在我不希望他们返回的页面上?避免使用jquery在浏览器历史记录中添加每个导航。@HumanHickory您会将其添加到所有不希望缓存信息的页面上。这!正是我需要的!我需要视图本身从浏览器历史中隐藏自己,而不是隐藏视图之前或之后的视图-这就是其他答案处理它的方式!