问题的提出是这样的:某个页面提交后,在作某些判断后,转到另一页面处理,而另一个页面中,又要访问递交页面的Request中form的各个变量值。我知道,用Server.Transfer()可以保留QueryString和form集合,但问题是,这个情况比较特殊,要转过去的那个页面是普通asp页面,所以好像不能使用Server.Transfer(),而Response.Redirect()是可以转的,但不知这种情况有没有办法同样保留QueryString和form集合?不知道我有没有把问题讲清楚:) 谢谢先!

解决方案 »

  1.   

    session保存变量应该可以的,问题是,这需要大量修改那个转入的asp文件了。我想知道,有没有更好的方法
      

  2.   

    把form的变量值加到url后面作为参数传递
      

  3.   

    谢谢!这样QueryString可以,那么form中用POST的那些Params呢?
      

  4.   

    二、用程序控制重定向 
       
      虽然超级链接能够从一个页面导航到另一个页面,但这种导航方式是完全由用户控制的。有些时候,我们可能要用代码来控制整个导航过程,包括何时转到另一个页面。在这些场合,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方法。 
      

  5.   

    1 用 session 变量
    or
    2 把所有的变量值加到url后面作为参数传递
      对于form中用POST的那些Params的话,
      只有在前一个页面中先接受,作为参数
      再传给下一个页面把
      

  6.   

    Response.Redirect(url.aspx?var1=value1&var2=value2....)
      

  7.   

    如果不用quertstring,那就只能写到一个文本或数据库中做记录,因为asp与asp.net中的session是不能共享的。~