我有一个ASP.NET MVC应用程序,有三个视图:view1
,view2
,view3
。用户浏览这些内容的逻辑方式是:view1
- > view2
- > view3
。
当用户到达view3
时,即使在浏览器中使用“后退”按钮,我也必须阻止他们加载view2
。
什么是与浏览器无关的良好实现方法?
答案 0 :(得分:4)
在大多数应用程序中,您必须应对浏览器的后退功能。用户已经习惯了,并且他想要使用它,他或多或少会讨厌在往返时试图欺骗他们的页面。
不要试图欺骗用户考虑他想做什么,然后尝试提供一个不完全破坏的页面。
答案 1 :(得分:2)
在您的应用程序中添加页面加载的引荐来源页面检查,然后显示页面或将用户重定向回使用的视图。您无法在客户端上操纵或禁止基本导航,但您可以在服务器端解决此问题
答案 2 :(得分:1)
我无法评论之前的帖子,但请注意,有些浏览器不会传递引荐来源,因此早期的解决方案会中断(实际上会抛出异常)。
这有两个步骤:
1)您必须阻止浏览器端缓存。如果你有一个三步过程,用户走过它并且它是动态的,你可能已经这样做了。如果不阻止缓存,后退按钮将显示view1的缓存。由于步骤2是在服务器端完成的,服务器将没有机会做任何事情。
2)正如之前的海报所说,你需要在服务器端做一些事情以防止显示。有两种方法可以做到这一点(尽管我的伪代码非常糟糕)。
a)快速&脏的方式是基于引用者。例如,您在view2的控制器上进行了以下检查:
if (request.urlreferrer.absolutepath == "controllerview1")
{ //good }
else
{ //bad }
此外,在“糟糕”的情况下,你将不得不考虑做什么。如果您使用表单来回传递值,那么当用户返回view2时,您会突然丢失。
请注意,有些浏览器不会传递引用,上述检查也不会有任何好处(而request.urlrefferer将为null)。(我相信这通常是应该的)防火墙。)在这种情况下你必须这样做:
b)我之前做过类似的事情。控制器view1 / 2/3本质上是一个向导,他们正在通过系统。每个控制器都更新与向导关联的db行。所以,视图2会做类似的事情:if (dbrow.last_saved_page_num == 1)
{ // good }
else
{ // bad
redirect("view" + dbrow.last_saved_page_num + 1);
}
答案 3 :(得分:0)
这超出了javascript的范围,并且无法禁用(虽然您可以告诉浏览器前进或后退,但您无法阻止它)。您需要服务器端解决方案来禁止访问页面。
答案 4 :(得分:0)
没有JavaScript解决方案,它必须在服务器端实现。
答案 5 :(得分:0)
如果你使用jquery之类的东西,可以在view1和视图2上添加一个触发页面加载的函数:
$(document).ready(function(){ window.history.forward(); });
或者你可以这样做
<html onload="window.history.forward()">
无论哪种方式都可以满足您的需求,但也许不是用户体验方面的最佳解决方案 - 但如果您需要使用它,那么它可能是最佳解决方案。