老生常谈的三个区别
在asp.net webform有三种跳转方式。Response.Redirect输出到客户端实现跳转。Server.Transfer是直接在服务器端实现跳转到指定的页面去执行。Server.Execute是跳转到指定的页面执行,然后再跳转回原来的页面继续执行。假定是由A跳转到B页面。
注意:
1.Server.Transfer和Server.Execute对于页面的跳转是在服务器端实现的,A页面和B页面的执行是在同一个线程内执行的。在使用Server.Transfer和Server.Execute时,如果在A页面和B页面通过cookie传递值。会遇到两个很有趣的现象。1.下面的代码,B页面能获得A页面产生的cookie值,cookie不是服务器端输出到客户端以文件的形式保存?Server.Transfer和Server.Execute都是直接在服务器端跳转并没有输出到浏览器的。怎么B页面能获取到cookie值呢?原因就是A和B页面是在同一个线程执行的,而要输出到客户端的cookie值肯定要在线程的某个地方保存。因此B页面是能获取到A页面的cookie值。2.这个有趣的想象是在执行完毕输出到客户端后,当重复刷新页面时,或发现一个不同步的想象,a的值是2,并且保存到cookie中,但是B获取到的值还是1.再次重复刷新就会发现,A页面的值a和B页面获取的值总是差1.这个原因就是在重复刷新时,由于在第一次执行后已经将cookie写入到客户端,因此这时B页面获取cookie不是从线程中获取,而是从客户端的发送的cookie获取,就会造成这么一个想象。
A页面:
View Code
1 static int a = 1;//只做测试用,不考虑多线程并发。
2 protected void Page_Load(object sender, EventArgs e)
3 {
4 a = a + 1;
5 Response.Cookies.Add(new HttpCookie("test",a.ToString()));
6
7 Session["a"] = a;
8 Server.Transfer("~/Default2.aspx");
9
10 }
B页面:
View Code
2.对于Server.Transfer和Server.Execute在页面执行完毕之后,点击刷新或者F5还是会造成数据的重复提交。如果是使用Response.Redirect重复刷新将不会有问题。
1 if (Request.Cookies["test"]==null)
2 {
3 Response.Write("空");
4 }
5 else
6 {
7 string a = Request.Cookies["test"].Value;
8 Response.Write(Request.Cookies["test"].Value);
9 }