在VS2005所创建的Web程序中,有两个页面,分别是Default.aspx和Default2.aspx在页面Default.aspx中填加一个按钮Button2,然后在其OnClick事件中填加代码:
    protected void Button2_Click(object sender, EventArgs e)
    {
        try
        {
            Server.Transfer("Default2.aspx", false);
        }
        catch (Exception ex)
        {
            Label1.Text = ex.Message;
        }
    }
即让其转向页面Default2.aspx.如果使用断点调试,会发现在执行了Server.Transfer("Default2.aspx", false);这个语句后,会再次进入Default.aspx页面的Page_Load()中,执行一遍Page_Load()中的代码,这不是很奇怪么? 然后就会进入catch (Exception ex),把鼠标悬停在ex变量上,会显示信息:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。" 请问这是为什么? 大家有兴趣可以试一试.

解决方案 »

  1.   

    server.Transfer与response.Redirect的作用都是重定向,我认为它与response.Redirect相比有两个优点、一个缺点。优点:
    一、它在服务器端直接重定向,不用像response.Redirect一样先与浏览器通信再重定向,效率高。
    二、它可以传递上一个页面的提交值。比如:A页面提交值到B页面,B页面Transfer到C页面,C页面同样可以收到A页面提交的值。缺点:不能刷新页面,比如:A页面提交登录信息到B页面,B页面处理后Transfer再到A,A页面得不到刷新,指定了过期也不行。如果A、B页面不在同一个目录下,我们还会发现更多意想不到的结果,使用相对链接的图片、超链接的指向都改变了,造成这种原因是B页面读取A页面内容却以B页面的身份输出,所以路径改变了。
     
     
     
      

  2.   

    看了一下,你捕获到的异常应该是:System.Threading.ThreadAbortException有个说法就是对于这个异常,不用处理..也就是说
    Server.Transfer("Default2.aspx", false);
    或者
    Response.Transfer("Default2.aspx");都会产生这个异常,而这时你放在try..catch中所以就被你捕获到了..或者这样说,Transfer,Response不要放在try..catch..中