16

我有 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 并立即跳出 - 因此上述语句中的“真” - 据我所知,这应该停止当前页面的执行。问题是,它没有。我期待重定向抛出“线程中止异常”。

当我在调试模式下运行时,它会继续单步执行,就好像它不只是重定向并离开一样。

但是重定向仍然开始 - 一旦我完成了 BasePage 的其余部分,“Discontinued”页面就会作为重定向的结果开始加载。

我的重定向不会终止 BasePage 的执行是否有原因?

4

6 回答 6

34

Response.Redirect 的第二个参数是endResponse,但工具提示显示“指示当前页面的执行是否应终止”。这是一种误导,因为当变量为真时,页面的执行实际上并没有终止。它将完成运行任何代码。然而,不同的是,Render 事件被取消,并且响应立即与对象移动的标题一起刷新。

您需要手动退出任何方法, Response.Redirect / Response.End 不会为您执行此操作。此外,如果您需要条件来查看页面是否已被重定向,请查看 Response.IsRequestBeingRedirected。

于 2008-12-16T22:33:57.833 回答
12

您是否正在退出调用重定向的函数,例如

...redirect(stopit,true);
return;

?

于 2008-12-16T22:05:27.750 回答
3

可能您在 try{}catch{} 块内调用 Response.Redirect 方法,通过在该块外调用来尝试它,您会发现它不会失败。更多信息: http ://www.velocityreviews.com/forums/t72105-responseredirect-in-a-trycatch.html 希望这会有所帮助。

于 2008-12-16T22:05:38.593 回答
3

您可以抛出异常,该异常将退出代码执行,但仍会重定向:

HttpContext.Current.Response.Redirect("/login", true);
throw new Exception("Unauthorized Access");
于 2015-02-19T21:23:23.413 回答
1

我要为此投反对票!诅咒我的无知...

显然,您可以尝试在重定向之后添加以下行(如递归所指出的那样),

response.end()

但也许 response.redirect 没有立即导致重定向的原因是您有响应缓冲(默认)并且页面处理直到缓冲区被刷新后才结束。如果这是真的(诚然我也懒得尝试),那么添加以下行也可以解决您的问题。

response.flush()
于 2008-12-16T22:26:20.017 回答
0

对于无条件终止,您可以尝试

Response.End()
于 2008-12-16T22:08:02.737 回答