我有Default.aspx页面,它继承自BasePage.cs,它继承自System.Web.UI.Page。 BasePage是我在加载时每页必须做的一些常见事情。
在BasePage中,假设我正在检查X.如果X = 1,那么我将立即重定向到我的“Discontinued.aspx”页面并停止执行BasePage。如果我发现X = 1,我说:
HttpContext.Current.Response.Redirect(“Discontinued.aspx”,true);
我希望重定向停止执行BasePage并立即跳出 - 因此上面语句中的“true” - 应该按照我的理解停止执行当前页面。问题是,它没有。我期待重定向抛出“线程中止异常”。
当我在调试模式下运行时,它会逐步调整,就好像它不仅仅是重定向和离开一样。
但是重定向仍然开始 - 一旦我完成了其他的BasePage,“Discontinued”页面就会因重定向而开始加载。
我的Redirect是否有理由不会杀死BasePage的执行?
答案 0 :(得分:31)
Response.Redirect的第二个参数是endResponse
,但是工具提示显示“表示当前页面的执行是否应该终止”。这是误导性的,因为当变量为true时,页面的执行实际上不会终止。它将完成运行任何代码。然而,不同的是,Render事件被取消,并且响应立即被对象移动的头部刷新。
您需要手动退出任何方法,Response.Redirect / Response.End将不会为您执行此操作。此外,如果您需要条件查看页面是否已被重定向,请查看Response.IsRequestBeingRedirected。
答案 1 :(得分:10)
您是否从调用重定向的函数退出,例如
...redirect(stopit,true);
return;
答案 2 :(得分:2)
可能你正在try {} catch {}块中调用Response.Redirect方法,通过在这个块之外调用来尝试它,你会发现它不会失败。 更多信息: http://www.velocityreviews.com/forums/t72105-responseredirect-in-a-trycatch.html 希望这会有所帮助。
答案 3 :(得分:1)
我要投票支持这个!诅咒我的无知......
显然你可以尝试在重定向后添加以下行(如递归所指出的),
response.end()
但是,response.redirect没有立即引起重定向的原因可能是你有(默认)响应缓冲,并且在刷新缓冲区之前页面处理才会结束。如果这是真的(并且我承认我也懒得尝试),那么添加以下行也可以解决你的问题。
response.flush()
答案 4 :(得分:1)
您可以抛出异常,该异常将退出代码执行,但仍会重定向:
HttpContext.Current.Response.Redirect("/login", true);
throw new Exception("Unauthorized Access");
答案 5 :(得分:0)
对于无条件终止,您可以尝试
Response.End()