在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变量上,会显示信息:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。" 请问这是为什么? 大家有兴趣可以试一试.
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变量上,会显示信息:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。" 请问这是为什么? 大家有兴趣可以试一试.
一、它在服务器端直接重定向,不用像response.Redirect一样先与浏览器通信再重定向,效率高。
二、它可以传递上一个页面的提交值。比如:A页面提交值到B页面,B页面Transfer到C页面,C页面同样可以收到A页面提交的值。缺点:不能刷新页面,比如:A页面提交登录信息到B页面,B页面处理后Transfer再到A,A页面得不到刷新,指定了过期也不行。如果A、B页面不在同一个目录下,我们还会发现更多意想不到的结果,使用相对链接的图片、超链接的指向都改变了,造成这种原因是B页面读取A页面内容却以B页面的身份输出,所以路径改变了。
Server.Transfer("Default2.aspx", false);
或者
Response.Transfer("Default2.aspx");都会产生这个异常,而这时你放在try..catch中所以就被你捕获到了..或者这样说,Transfer,Response不要放在try..catch..中