我有一个简单的问题。如果我正在使用Response.Redirect(),假设用户取消重定向,是否会终止所有页面功能?
例如,假装我有一个带有按钮的页面,当按下该按钮时,弹出一条显示“hi”的消息。然后,在代码中的某个点,用户遇到Response.Redirect()。在浏览器上清除页面之前,他们在浏览器中点击STOP。然后,他们点击按钮。它还会说“hi”,还是页面不起作用?
编辑更多信息: 也许我只是不理解答案,但我仍然没有回答我的问题。 让我重新说明一点。
我有两个按钮,它们在单击时都执行C#功能。其中一个执行Response.Redirect()到另一个页面。另一个在消息框中打印出“Hi”。用户按下按钮1. response.redirect开始处理,但在重定向用户之前,他们认为他们犯了错误并且他们在浏览器中点击了STOP按钮。用户仍在查看同一网页。他们点击按钮#2。我的问题是,“Hi”消息是否弹出? C#功能是否仍然有效?或者在尝试重定向后,后面的代码是否无法访问?
答案 0 :(得分:1)
除非浏览器实际上已重定向,或者您已经放置了一些特定代码来使其无效,否则第二个事件完全独立于第一个事件。当您单击第二个按钮时,它会向服务器发送一个全新的请求,而之前点击另一个按钮的事实将对它没有任何影响 - 除非您自己明确地跟踪了该事件,否则它甚至都不会请注意之前点击了其他按钮。
第二个按钮将正常启动,第二个C#功能将启动。你真的不应该看到浏览器在单击第二个按钮,单击第一个按钮,停止浏览器重定向,然后单击第二个按钮之间的任何差异。
答案 1 :(得分:1)
<强>解决方案强>
网络连接速度较慢的用户确实会在较长时间内看到初始页面。
如果您只想阻止他们误按这些按钮,您可以创建一个<div>
来覆盖整个屏幕区域并使用半透明图像将其灰显。除非刷新页面,否则用户将无法单击按钮。
您可以通过在表单提交上显示jQuery modal dialog来轻松获得此效果,并向用户显示正在保存数据的消息。
此解决方案仅可防止意外点击。如果要防止恶意重复请求,除了模式对话框之外,您还应该跟踪服务器上的应用程序状态并指示已经进行了保存。一个简单的会话变量应足以表明这一点。
技术解释
Web服务器使用的http协议是无状态的。每次向服务器发送请求时,它都会构建您的Page对象以服务此请求并返回回复。它不会记得你上次发送的内容。如果你需要,你必须自己做。
单击“hi”按钮时,在c#代码中设置消息。在回复此请求时,服务器将回复成功状态消息HTTP/1.1 200 OK
作为响应的第一行。这告诉浏览器一切正常,它将根据返回的Content-Type
标头处理响应。
单击按钮以重定向到其他页面时。您的浏览器向第一页发送请求。当您执行Response.Redirect
服务器时,会向浏览器发送重定向消息。
HTTP/1.1 302 Found
Location: http://Page2URL
这告诉浏览器必须转到这个新位置才能获得响应。浏览器现在向位置标题提到的URL发出新请求并获得响应。
用户可以在任何这些阶段中止请求。由于http是无状态的,您可以重新提交两个请求或单击另一个按钮并发出新请求。服务器将尽职尽责地将它发送到asp.net,就像从未发生任何事情一样,你会收到回复。
答案 2 :(得分:0)
Response.Redirect进程通常是:
浏览器加载的页面 - 所有javascript类型的内容就像显示alert('hi');
一样有效。
用户点击导致回发的按钮。
onclick代码,在帖子后面有一个Response.Redirect
,它向浏览器发送一条消息以加载不同的页面。
浏览器加载新页面(转到1)。
如果用户在3到4之间的某处单击“停止”,则不会加载新页面,旧页面仍处于活动状态。因此,该页面上的任何javascript仍然是可执行的,例如alert('hi');
现在,在某些情况下,当涉及Ajax和jQuery时,页面完全有可能进入以前可用的javascript不再起作用的情况;但这并不是你所说的。
答案 3 :(得分:0)
这不是Response.Redirect()的工作方式。
当用户单击按钮(可能会向服务器发出POST请求)时,在客户端收到服务器响应之前,客户端不会发生任何事情。如果生成响应的代码调用了Response.Redirect,则响应将是300系列重定向,而不是常规的200页。当浏览器收到重定向时,浏览器将为重定向到的位置发出后续的GET请求。
如果用户在发出POST请求后但在收到300重定向之前按下“停止”按钮,则浏览器将忽略服务器响应。
...除非你的页面上运行了Javascript,但是它与发出任何其他请求的页面没有什么不同。