在ASPNET应用中Web表单之间的导航有多种方式用超级链接用ResponseRedirect用ServerTransfer或者用ServerExecute本文将分析这四种导航方式的异同及其优缺点帮助你选择最佳的导航方式
一超级链接
从一个表单进入另一个表单最简单的方式是使用HTML超级链接控件在Web表单中使用超级链接的HTML代码类如
进入表单
当用户点击该超级链接x执行并将结果发送到浏览器超级链接导航方式几乎可用于任何地方包括HTML页面和普通的ASP页面ASPNET还提供了另一种可替换使用的方法即HyperLink服务器控件
上述HTML代码的运行结果和第一个例子相同因为ASPNET把HyperLink Web服务器控件视为一个HTML超级链接控件但两者有一点重要的区别HyperLink Web服务器控件可以在服务器端编程具体地说可以在程序代码中改变它的NavigateUrl属性从而允许构造出具体目标可根据应用的当前状态动态变化的超级链接例如
Private Sub Button_Click( _
ByVal sender As SystemObject _
ByVal e As SystemEventArgs) _
Handles ButtonClick
HyperLinkNavigateUrl = WebFormaspx
End Sub
这段代码执行后如果用户点击链接他看到的将是WebFormaspx而不是x
二用程序控制重定向
虽然超级链接能够从一个页面导航到另一个页面但这种导航方式是完全由用户控制的有些时候我们可能要用代码来控制整个导航过程包括何时转到另一个页面在这些场合ASPNET有三种不同的方式可以达到相似的目的调用Response对象的Redirect方法调用Server对象的Transfer或Execute方法这三种导航方式的行为基本相似但也有区别
ResponseRedirect
ResponseRedirect方法导致浏览器链接到一个指定的URL当ResponseRedirect()方法被调用时它会创建一个应答应答头中指出了状态代码(表示目标已经改变)以及新的目标URL浏览器从服务器收到该应答利用应答头中的信息发出一个对新URL的请求
这就是说使用ResponseRedirect方法时重定向操作发生在客户端总共涉及到两次与服务器的通信(两个来回)第一次是对原始页面的请求得到一个应答第二次是请求应答中声明的新页面得到重定向之后的页面
ServerTransfer
ServerTransfer方法把执行流程从当前的ASPX文件转到同一服务器上的另一个ASPX页面调用ServerTransfer时当前的ASPX页面终止执行执行流程转入另一个ASPX页面但新的ASPX页面仍使用前一ASPX页面创建的应答流
如果用ServerTransfer方法实现页面之间的导航浏览器中的URL不会改变因为重定向完全在服务器端进行浏览器根本不知道服务器已经执行了一次页面变换
默认情况下ServerTransfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面但只要把该方法的第二个参数设置成True就可以保留第一个页面的表单数据和查询字符串
同时使用ServerTransfer时应注意一点目标页面将使用原始页面创建的应答流这导致ASPNET的机器验证检查(Machine Authentication CheckMAC)认为新页面的ViewState已被篡改因此如果要保留原始页面的表单数据和查询字符串集合必须把目标页面Page指令的EnableViewStateMac属性设置成False
ServerExecute
ServerExecute方法允许当前的ASPX页面执行一个同一Web服务器上的指定ASPX页面当指定的ASPX页面执行完毕控制流程重新返回原页面发出ServerExecute调用的位置
这种页面导航方式类似于针对ASPX页面的一次函数调用被调用的页面能够访问发出调用页面的表单数据和查询字符串集合所以要把被调用页面Page指令的EnableViewStateMac属性设置成False
默认情况下被调用页面的输出追加到当前应答流但是ServerExecute方法有一个重载的方法允许通过一个TextWriter对象(或者它的子对象例如StringWriter对象)获取被调用页面的输出而不是直接追加到输出流这样在原始页面中可以方便地调整被调用页面输出结果的位置
为说明其工作过程下面我们创建一个Web表单放入一个按钮控件(Button)和一个文本控件(Literal)在设计界面中转入代码视图加入一个SystemIO名称空间的Imports语句然后加入用户点击按钮时执行的代码
Private Sub Button_Click( _
ByVal sender As SystemObject _
ByVal e As SystemEventArgs) _
Handles ButtonClick
Dim sw As StringWriter = New StringWriter()
ServerExecute(x sw)
LiteralText = swToString()
End Sub
然后为同一个Web应用创建第二个页面x转入该页面的HTML视图修改其Page指令禁止ViewState检查
<%@ Page Language=vb AutoEventWireup=false Codebehind=xvb
Inherits=NavigateWebForm EnableViewStateMac=false%>
再转到设计视图为第二个页面增加一些控件接下来把第一个页面设置成默认页面启动应用点击按钮WebForm的控件将显示在WebForm中放置Literal按钮的地方如图一注意页面标题和URL仍旧显示原始页面WebForm
educitycn/img_///gif>图一用ServerExecute合并两个源文件的页面用ServerTransfer或ServerExecute方法实现导航时还要注意一点最后得到的页面可能不是合法的HTML页面因为最终返回给客户端的页面可能包含多个和
等标记
IE浏览器看来能够容忍并正确处理这类情形
但如果用户要用到其他的浏览器
最好仔细测试一下
三比较与选择
既然从一个页面导航到另一个页面的办法有这么多应该如何选择最佳的导航方式呢?下面是一些需要考虑的因素
如果要让用户来决定何时转换页面以及转到哪一个页面超级链接最适合
如果要用程序来控制转换的目标但转换的时机由用户决定使用Web服务器的HyperLink控件动态设置其NavigateUrl属性
如果要把用户连接到另一台服务器上的资源使用ResponseRedirect
用ResponseRedirect把用户连接到非ASPX的资源例如HTML页面
如果要将查询字符串作为URL的一部分保留使用ResponseRedirect
如果要将执行流程转入同一Web服务器的另一个ASPX页面应当使用ServerTransfer而不是ResponseRedirect因为ServerTransfer能够避免不必要的网络通信从而获得更好的性能和浏览效果
如果要捕获一个ASPX页面的输出结果然后将结果插入另一个ASPX页面的特定位置则使用ServerExecute
如果要确保HTML输出合法请使用ResponseRedirect不要使用ServerTransfer或ServerExecute方法