2012-08-15 85 views
2

我的代码如下所示:响应重定向回发

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(IsPostback) 
    { 
     if(/* User is not authenticated to perform any actions on this page */) 
     { 
     Response.Redirect(/* Error Page */); 
     } 
    } 
} 

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    /* do some stuff */ 
} 

我早就猜到了,如果我提交按钮做回发,我并没有通过身份验证,然后在Page_Load重定向会发生,就送返回一个HTTP 302.但是,它似乎运行Response.Redirect代码行,继续处理它在Page_Load中,然后甚至运行btnSubmit_Click。响应不是错误页面。

我可以在Response.Redirect之后调用return来防止在该函数中进一步处理,但btnSubmit_Click函数仍然可以运行。

它为什么会这样工作?

+0

+1。这很奇怪。在我的电脑上,您的代码的确切版本不会执行'btnClick';它立即重定向。 – Icarus 2012-08-15 20:37:41

+0

您是否有机会在Page_Load中捕捉一些异常?通常情况下,'Response.Redirect'会抛出'ThreadAbortException',从而阻止ASP运行时进一步处理您的请求。但是,如果吞下异常,则处理继续。由于我在开始时提出的问题,我在评论中没有回答这个问题。 – 2012-08-15 20:54:55

回答

4

为了防止从处理更多的代码,使用:

Reponse.Redirect(url, true); 

第二个参数将结束进一步的处理。

+0

这似乎工作,但现在我想知道是否有任何情况下,Page_Load不会在回发中调用,并且如果可以安全地将所有验证代码放在Page_Load中而不是每个单独的处理程序中? – 2012-08-15 20:43:00

+0

应始终调用“Page_Load”以保证安全。但是,您也可以考虑查看处理配置中的身份验证检查(web.config)。 – 2012-08-15 20:48:44

+0

+1。虽然这个答案显然有效,但我想知道为什么在我的测试中我不需要在第二个参数上传递'true',并且我的click事件处理程序仍然不会触发。 – Icarus 2012-08-16 02:16:00