Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 限制在没有JavaScript的情况下使用后退按钮_C#_Asp.net_Web Applications_Caching - Fatal编程技术网

C# 限制在没有JavaScript的情况下使用后退按钮

C# 限制在没有JavaScript的情况下使用后退按钮,c#,asp.net,web-applications,caching,C#,Asp.net,Web Applications,Caching,我目前参与了一个ASP.NET项目,我需要限制用户使用“后退”按钮返回页面结构的能力。它本质上是一个向导式的导航,我不想让用户从上一步返回并重新提交数据。不幸的是,JavaScript不是一个选项,所以我通过将每个页面加载事件中的HttpCacheability设置为NoCache来“解决”它。当用户单击后退按钮时,将显示“页面过期”页面。它一点也不优雅,我想知道还有什么其他选择可以达到预期的效果。这是不可能的。即使你在Firefox的internet explorer中使用它,它也不会工作 处

我目前参与了一个ASP.NET项目,我需要限制用户使用“后退”按钮返回页面结构的能力。它本质上是一个向导式的导航,我不想让用户从上一步返回并重新提交数据。不幸的是,JavaScript不是一个选项,所以我通过将每个页面加载事件中的HttpCacheability设置为NoCache来“解决”它。当用户单击后退按钮时,将显示“页面过期”页面。它一点也不优雅,我想知道还有什么其他选择可以达到预期的效果。

这是不可能的。即使你在Firefox的internet explorer中使用它,它也不会工作


处理此问题的唯一方法是,您需要在用户会话、数据库等中保存用户步骤的状态,然后在用户提交时验证其提交的步骤是否正确。

将导航状态保留在服务器端,如果用户点击的页面与下一次/上一次单击不一致,将它们重定向到它们应该位于的位置。

仅为整个向导公开一个URL。显示的步骤取决于会话状态,会话状态可以存储他们已经完成的步骤

这样,用户就不会加载“无效”URL


你应该考虑为每个步骤创建一个用户控件。然后,将所有步骤放在一个.aspx页面上,并根据需要显示和隐藏它们。

简短的回答是“你不能”。因为它是浏览器端的功能,所以任何实现这一点的方法都将通过浏览器公开的某个内容,这意味着它很容易失败。很长的答案是你不想。这会产生可用性问题(对正常浏览器行为的任何更改都是不必要的)。我建议使用会话cookie来确定他们应该在流程中的什么位置,如果他们试图访问流程的错误页面(在处理任何GET/POST数据以及丢弃他们可能提交的任何数据之前),则向相应页面发出302重定向。试图通过改变浏览器基本功能的工作方式来击败用户总是会带来麻烦。

我创建了一个单独的类,我将其存储在一个强类型会话中,该会话具有“上一页”属性,因此只允许在某些步骤之间进行导航,问题是,如果用户使用firefox,当他们使用“后退”按钮时,不会触发任何事件,因为它使用完美的内存缓存,不会触发过期的页面事件或页面加载事件,因此即使使用自定义类,也不会执行任何操作,除非您在提交它们当前所在的位置以及您期望它们的位置。感谢Chris,我现在接受了这样的想法,即当按下“后退”按钮时,我必须让页面显示旧数据。正如我最初在文章中所说的,它们不能再次发送,因为一旦用户进入最后一步,从用户收集的缓存数据就会被清除。在重定向到最后一页之前,我只需清除表单就可以了。重新设计。任何网站设计,不能应付后退按钮是严重破坏。请不要把它强加给世界。这样他们就可以提交两次相同的数据,而您的后端会做正确的事情,怎么样?这是一个更有用的解决方案。这实际上是一个很好的观点。目前我确实涵盖了这一部分,因为服务不会被另一个请求击中,所以限制后退按钮的使用实际上可能有些过火,而且没有必要。请看:我认为这是我需要走的路。我需要扩展当前的功能,而不是改变浏览器的基本功能,正如Matt在下面不鼓励的那样。谢谢大家。如果您的向导使用完整回发,这不是一个可行的解决方案,您仍然可以使用“上一步”按钮重做发布数据。如果你运行一个ajax应用程序,这是可行的。我不确定为什么完整的回发会很重要。使用会话中存储的步骤信息,代码将始终能够确定用户应执行的步骤。我的观点是,如果他试图使用其状态保存功能来确定显示哪些用户控件,则“后退”按钮仍将允许用户访问以前的控件,因此我的观点是,您需要验证其当前步骤与位置他们应该在每一封回信上。