当前页面位置: » 丰搜网 » 文档中心 » 详细内容
asp.net四种页面导航方式的比较与选择
asp.net应用中,web表单之间的导航有多种方式:用超级链接,用response.redirect,用server.transfer,或者用server.execute。本文将分析这四种导航方式的异同及其优缺点,帮助你选择最佳的导航方式。
一、超级链接
从一个表单进入另一个表单最简单的方式是使用html超级链接控件。在web表单中,使用超级链接的html代码类如:
| <a href="webform2.aspx">进入表单2</a> |
当用户点击该超级链接,
webform2.
aspx执行并将结果发送到浏览器。超级链接导航方式几乎可用于任何地方,包括
html页面和普通的
asp页面。
asp.net还提供了另一种可替换使用的方法,即hy
perlink
服务器控件:
<form id="form1" method="post" runat="server"> <asp:hyperlink id="hyperlink1" runat="server" navigateurl="webform2.aspx">进入表单2</asp:hyperlink> </form> |
上述
html代码的运行结果和第一个例子相同,因为
asp.net把hy
perlink
web服务器控件视为一个
html超级链接控件。但两者有一点重要的区别,hy
perlink
web服务器控件可以在
服务器端编程。具体地说,可以在程序代码中改变它的navigateurl属性,从而允许构造出具体目标可根据应用的当前状态动态变化的超级链接,例如:
private sub button1_click( _ byval sender as system.object, _ byval e as system.eventargs) _ handles button1.click hyperlink1.navigateurl = "webform3.aspx" end sub |
这段代码执行后,如果用户点击链接,他看到的将是
webform3.
aspx,而不是
webform2.
aspx。
二、用程序控制重定向
虽然超级链接能够从一个页面导航到另一个页面,但这种导航方式是完全由用户控制的。有些时候,我们可能要用代码来控制整个导航过程,包括何时转到另一个页面。在这些场合,
asp.net有三种不同的方式可以达到相似的目的:调用response对象的redirect方法,调用server对象的transfer或execute方法。这三种导航方式的行为基本相似,但也有区别。
2.1 response.redirect
response.redirect方法导致浏览器链接到一个指定的url。当response.redirect()方法被调用时,它会创建一个应答,应答头中指出了状态代码302(表示目标已经改变)以及新的目标url。浏览器从
服务器收到该应答,利用应答头中的信息发出一个对新url的请求。
这就是说,使用response.redirect方法时重定向操作发生在客户端,总共涉及到两次与
服务器的通信(两个来回):第一次是对原始页面的请求,得到一个302应答,第二次是请求302应答中声明的新页面,得到重定向之后的页面。
2.2 server.transfer
server.transfer方法把执行流程从当前的
aspx文件转到同一
服务器上的另一个
aspx页面。调用server.transfer时,当前的
aspx页面终止执行,执行流程转入另一个
aspx页面,但新的
aspx页面仍使用前一
aspx页面创建的应答流。
如果用server.transfer方法实现页面之间的导航,浏览器中的url不会改变,因为重定向完全在
服务器端进行,浏览器根本不知道
服务器已经执行了一次页面变换。
默认情况下,server.transfer方法不会把表单数据或查询字符串从一个页面传递到另一个页面,但只要把该方法的第二个参数设置成true,就可以保留第一个页面的表单数据和查询字符串。
同时,使用server.transfer时应注意一点:目标页面将使用原始页面创建的应答流,这导致
asp.net的机器验证检查(machine authentication check,mac)认为新页面的viewstate已被篡改。因此,如果要保留原始页面的表单数据和查询字符串集合,必须把目标页面page指令的enableviewstatemac属性设置成false。
2.3 server.execute
server.execute方法允许当前的
aspx页面执行一个同一
web服务器上的指定
aspx页面,当指定的
aspx页面执行完毕,控制流程重新返回原页面发出server.execute调用的位置。
这种页面导航方式类似于针对
aspx页面的一次函数调用,被调用的页面能够访问发出调用页面的表单数据和查询字符串集合,所以要把被调用页面page指令的enableviewstatemac属性设置成false。
默认情况下,被调用页面的输出追加到当前应答流。但是,server.execute方法有一个重载的方法,允许通过一个textwriter对象(或者它的子对象,例如stringwriter对象)获取被调用页面的输出,而不是直接追加到输出流,这样,在原始页面中可以方便地调整被调用页面输出结果的位置。
为说明其工作过程,下面我们创建一个
web表单,放入一个按钮控件(button1)和一个文本控件(literal1),在设计界面中转入代码
视图,加入一个system.io名称空间的imports语句,然后加入用户点击按钮时执行的代码:
private sub button1_click( byval sender as system.object, byval e as system.eventargs) handles button1.click dim sw as stringwriter = new stringwriter() server.execute("webform2.aspx", sw) literal1.text = sw.tostring() end sub |
然后为同一个
web应用创建第二个页面
webform2.
aspx。转入该页面的
html视图,修改其page指令禁止viewstate检查:
<%@ page language="vb" autoeventwireup="false" codebehind="webform2.aspx.vb" inherits="navigate.webform2" enableviewstatemac="false"%> |
再转到设计
视图,为第二个页面增加一些控件。接下来,把第一个页面设置成默认页面,启动应用。点击按钮,
webform2的控件将显示在
webform1中放置literal按钮的地方,如图一,注意页面标题和url仍旧显示原始页面
webform1。
图一:用server.execute合并两个源文件的页面
关键字 本文所属关键字
相关 与本文相关文章
分类 所有文章关键字导航
标准 网站致力的规范
|