`

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还提供了另一种可替换使用的方法,即HyperLink服务器控件:

<form id="Form1" method="post" runat="server">
<asp:HyperLink id="HyperLink1" runat="server"
NavigateUrl="WebForm2.aspx">进入表单2</asp:HyperLink>
</form>


  上述HTML代码的运行结果和第一个例子相同,因为ASP.NET把HyperLink Web服务器控件视为一个HTML超级链接控件。但两者有一点重要的区别,HyperLink 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合并两个源文件的页面

 
  用Server.Transfer或Server.Execute方法实现导航时,还要注意一点:最后得到的页面可能不是合法的HTML页面,因为最终返回给客户端的页面可能包含多个<HTML>和<BODY>等标记。IE浏览器看来能够容忍并正确处理这类情形,但如果用户要用到其他的浏览器,最好仔细测试一下。

  三、比较与选择

  既然从一个页面导航到另一个页面的办法有这么多,应该如何选择最佳的导航方式呢?下面是一些需要考虑的因素:

  ·如果要让用户来决定何时转换页面以及转到哪一个页面,超级链接最适合。

  ·如果要用程序来控制转换的目标,但转换的时机由用户决定,使用Web服务器的HyperLink控件,动态设置其NavigateUrl属性。

  ·如果要把用户连接到另一台服务器上的资源,使用Response.Redirect。

  ·用Response.Redirect把用户连接到非ASPX的资源,例如HTML页面。

  ·如果要将查询字符串作为URL的一部分保留,使用Response.Redirect。

  ·如果要将执行流程转入同一Web服务器的另一个ASPX页面,应当使用Server.Transfer而不是Response.Redirect,因为Server.Transfer能够避免不必要的网络通信,从而获得更好的性能和浏览效果。

  ·如果要捕获一个ASPX页面的输出结果,然后将结果插入另一个ASPX页面的特定位置,则使用Server.Execute。

  ·如果要确保HTML输出合法,请使用Response.Redirect,不要使用Server.Transfer或Server.Execute方法。

分享到:
评论

相关推荐

    ASP.NET四种页面导航方式之比较与选择

    在ASP.NET应用中,Web表单之间的导航有多种方式:用超级链接,用Response.Redirect,用Server.Transfer,或者用Server.Execute。本文将分析这四种导航方式的异同及其优缺点,帮助你选择最佳的导航方式。

    ASP.NET中的四种导航方式

    本地记载在ASP.NET中四种页面跳转的的不同。

    asp.net教程 ASP.NET 参考手册

    本章介绍如何创建您的第一个简单的 ASP.NET 页面。 ASP.NET 服务器控件 本章介绍 ASP.NET 服务器控件。 ASP.NET 事件 本章介绍一些 ASP.NET 事件句柄。 ASP.NET Forms ASP.NET WEB 表单 本章介绍 ASP.NET 的 ...

    在ASP.NET 2.0中使用页面导航控件实例有源码

    而在asp.net 2.0中,为了方便进行页面导航,新增了一个叫做页面导航控件sitemapdatasource,sitemapdatasource中还可以绑定到不同的其他页面控件,比如treeview,menu等,十分灵活,使到能很方便地实现页面导航的不同...

    ASP.NET信息管理系统开发实例导航3

    ASP.NET信息管理系统开发实例导航 简介: 本书以多个实用的信息管理系统(包括教务实验课选课系统、电子购物商城、 物业管理系统、图书借阅系统、个人办公系统、公司内部管理系统)为案例,详细讲述了信息管理系统的...

    c#语言Asp.net 动态网站TreeView和XML实现页面动态导航

    c#语言Asp.net 动态网站TreeView和XML实现页面动态导航。用VS2005工具编写。很用,很简单的动态导航。

    ASP.NET实现静态的TreeView控件导航

    ASP.NET提供了一系列拥有页面导航功能的控件,这些控件包括在页面显示菜单的Menu控件、 提供站点导航的Site MapPath控件和显示层次结构的树形(TreeView)控件。本章的示例将介绍这些控件在创建Web应用程序中的应用...

    Q753697 asp.net中点击左侧菜单,右侧显示相应内容

    Q753697 asp.net中点击左侧菜单,右侧显示相应内容 https://ask.csdn.net/questions/753697

    Asp.net 2.0高级编程(pdf)

    36 2.9小结 38 第3章应用程序和页面框架 39 3.1应用程序的位置选项 39 3.1.1内置的Web服务器 39 3.1.2IIS 40 3.1.3FTP 41 3.1.4Web站点需要FrontPageExtensions 42 3.2ASP.NET页面结构选项 ...

    asp.net知识库

    在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...

    一个基于Web的分布导航方式完成ASP.NET程序安装的例子程序

    一个基于Web的分布导航方式完成ASP.NET程序安装的例子程序,采用ASP.NET+C#完成。

    零基础学ASP.NET

    ASP.NET程序的创建、配置和调用 ASP.NET开发环境Visual Studio 2005介绍 常量、变量、流程控制、面向对象 页面对象:Application、Session、Cookie、Request和Response 智能表单的创建:文本、表格、图像、上传等 ...

    Asp.net 页面导航的几种方法与比较 分享

    在ASP.NET应用中,Web表单之间的导航有多种方式:用超级链接,用Response.Redirect,用Server.Transfer,或者用Server.Execute。本文将分析这四种导航方式的异同及其优缺点,帮助你选择最佳的导航方式。

    asp.net.2.0.揭秘(英文原版)-part4

    卷1 主要内容包括创建ASP.NET 页面、设计ASP.NET 网站、数据访问、创建组件、站点导航等。 本书作者Stephen Walther 是ASP 界的名人,是微软公司的ASP.NET MVP(最有价值专家),荣获微软“软件传奇人物”称号...

    asp.net.2.0.揭秘(英文原版)-part3

    卷1 主要内容包括创建ASP.NET 页面、设计ASP.NET 网站、数据访问、创建组件、站点导航等。 本书作者Stephen Walther 是ASP 界的名人,是微软公司的ASP.NET MVP(最有价值专家),荣获微软“软件传奇人物”称号...

    计算机科学与技术ASP.net大作业

    的ASP.net保过资源,附赠文档。 例如其中一人文档如下 本系统主要可以实现以下功能: 1.登录界面:用户名,密码输入文本框,注册按钮跟登录按钮,连数据库识别用户和密码正误,正确则进入主页,用户名不存在,网页...

    零基础学asp.net

    ASP.NET2.0更是在ASP.NET1.1的基础上,添加和增强了很多Web控件,并提供了一套可扩展的应用程序模块,如成员、角色,母版以及导航等,使用这些模块,可以大大提高开发效率,这也代表着未来软件开发技术的发展趋势。...

    ASP.NET信息管理系统开发实例导航1

    ASP.NET信息管理系统开发实例导航 简介: 本书以多个实用的信息管理系统(包括教务实验课选课系统、电子购物商城、 物业管理系统、图书借阅系统、个人办公系统、公司内部管理系统)为案例,详细讲述了信息管理系统的...

Global site tag (gtag.js) - Google Analytics