ASP.NET四种页面导航方式分析
在ASP.NET应用中,Web表单之间的导航有多种方式:用超级链接,用Response.Redirect,用Server.Transfer,或者用Server.Execute。
1)第一种超链接谁都有用过,这种连接方式可以用在任何地方,包括HTML,ASPX,ASHX,甚至包括文件类型等。<a href="Default.aspx">超链接实现跳转</a>。
2)Response.Redirect{Response.Redirect("Default.aspx");}这种方式相信是我们最常用的了..我们用HttpWatch查看可以看到这种方式的执行的过程中如下图:
根据状态码可以看到,使用Response.Redirect方法时重定向操作发生在客户端,总共涉及到两次与服务器的通信(两个来回):第一次是对原始页面的请求,得到一个302应答(也就是对页面进行重定向),第二次是请求302应答中声明的新页面,得到重定向之后的页面。这种方法可以重定向到ASPX,ASHX,html等页面,也可以重定向到外网。
3)Server.Transfer{Server.Transfer("Default.aspx");}
还是使用工具查看一下执行的过程。
我们可以看到使用Server.Transfer这种方法实现页面之间的导航,浏览器中的URL是不会改变,因为重定向完全在服务器端进行,浏览器根本不知道服务器已经执行了一次页面变换。
默认情况下,Server.Transfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面,但只要把该方法的第二个参数设置成True,就可以保留第一个页面的表单数据和查询字符串。 也就是使用{Server.Transfer("Default.aspx", true);}
使用Server.Transfer的第二种方法时有一个Bug就是目标页面将使用原始页面创建的应答流,这导致ASP.NET的验证检查认为新页面的ViewState已被篡改。一种解决方法就是把目标页面Page指令的EnableViewStateMac属性设置成False。
4)Server.Execute{Server.Execute("Default.aspx");}其实从文字表面就看出了,这种方法就是在执行一个页面。这种方法在执行完第二个页面之后返回第一个页面执行。执行完之后我们查看也是只有一次请求。
这时候我们查看一下源代码会发现,这种方法,最终得到的Html页面其实是不合法的,它把两个页面的代码合并在了一起,代码中有了2个<html>和<body>等重复的标签。不过试了一下好像IE、谷歌、FF、Opera都支持这种代码。
Server.Execute还有一种重载方法是带2个参数的,第二个参数允许传入一个TextWriter对象(或者它的子对象,例如StringWriter对象)获取被调用页面的输出,而不是直接追加到输出流,这样,就可以方便的调整原始页面的地址。看下例子:
.cs代码
前台ASPX代码:
执行效果
看看效果就知道了:
查看源代码可以可以看到代码
后面这2种方法只是在内部服务器的前提下重定向操作,但是如果要在后台重定向到外网,那么就只有使用Response.Redirect这种方法,其他的都是没有效果的,会提示错误。
还有请求一般处理程序(ashx)的时候也是只能使用Response.Redirect其他也都是没有作用的。
水平有限,有错之处,欢迎指出。
本文从百度空间搬家到博客园。。