Response.Redirect,Server.Transfer,Server.Execute的区别(转)

Response.Redirect,Server.Transfer,Server.Execute的区别

http://bikerocking.spaces.live.com/blog/cns!C44CCBA0044FD131!359.entry

摘录
在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

 

note: from envykok


A view-state MAC is an encrypted version of the hidden variable that a page's view state is persisted to when sent to the browser. If true , the encrypted view state is checked to verify that it has not been tampered with on the client. Do not set EnableViewStateMac to true if performance is a key consideration.

如果你查看html源代码,你也许常会看到类似以下的代码片断:<input type="hidden" name="__viewstate"

其实,这就是Microsoft在asp.net应用viewstate技术的特征表现。为了页面能在postback后依然能读取服务器控件原有 的状态数据,asp.net中使用了viewstate技术,而viewstate技术本质上是用一个默认名称为"__viewstate的hidden 类型表单域来保存和传递数据(这些数据是经过了序列化后base64编码的字符串值,且是在方法 page.savepagestatetopersistencemedium输出前保存、并由 page.loadpagestatefrompersistencemedium加载)。

简单的我们可以通过三种级别来轻松禁用 掉这些数据的往返传递

machine级 在machine.config中设置<pages enableviewstate=false />
application级 在web applicatin的web.config中设置<pages enableviewstate=false />
单页面级 在该页面中设置<%@page enableviewstate=false %>或通过代码设置page.enableviewstate = false;
这样可以减轻客户端对服务器端的压力。

但是这样以来,你将不能够使用ASP.NET提供的服务器控件给你带来的便捷了。所以建议使用单页面级设置比较好,可以仅对哪些不需要使用服务器空间的页面来设置。

 

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浏览器看来能够容忍并正确处理这类情形,但如果用户要用 到其他的浏览器,最好仔细测试一下。
  三、比较与选择      
  既然从一个页面导航到另一个页面的办法有这么多,应该如何选择最佳的导航方式呢?下面是一些需要考虑的因素:
1.如果要让用户来决定 何时转换页面以及转到哪一个页面,超级链接最适合。
2.如果要用程序来控制转换的目标,但转换的时机由用户决定 ,使用Web服务器的HyperLink控件,动态设置其NavigateUrl属性。
3. 如果要把用户连接到另一台服务器上的资源 ,使用Response.Redirect。
4. 用Response.Redirect把用户连接到非ASPX的资源 ,例如HTML页面。
5. 如果要将查询字符串作为URL的一部分保留,使用Response.Redirect。

note: from envykok

Response.Redirect("Page2.aspx?a=1"); //URL将变为 Page2.aspx?a=1

Server.Execute("Page2.aspx?a=1");// URL 不变

Server.Transfer("Page2.aspx?a=1");// URL 不变

 

6. 如果要将执行流程转入同一Web服务器的另一个ASPX页面,应当使用Server.Transfer而不是Response.Redirect,因为 Server.Transfer能够避免不必要的网络通信,从而获得更好的性能和浏览效果。
7. 如果要捕获一个ASPX页面的输出结果,然后将结果插入另一个ASPX页面的特定位置 ,则使用Server.Execute。
8. 如果要确保HTML输出合法,请使用Response.Redirect,不要使用Server.Transfer或Server.Execute方法。
  本文译自:http://www.ondotnet.com/pub/a/dotnet/2003/04/07/aspnetnav.html      
  原文题目:《Managing   ASP.NET   Navigation》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值