从一个页面转向另一个页面的请求方式有两种,Post和Get.

如果从原理上来探究他们的区别,涉及到Http传输协议的细节,本文不加探究,只讨论一下表象。

所有的人都知道如下区别:
1.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。
2.Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1024字节.
3.Post顾名思义,就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post的信息作为http请求的内容,而Get是在Http头部传输的。

我们的form表单的method方法,有两个,post,get.它在页面传值的时候的区别也就是上面提到的三点.

先来看一下post方法.

这个方法在asp时代应该跟程序员打交道很多的,因为那时候没有现在的ViewState,每个页面要恢复原来的状态,都要将页面Post给自身,然后挨个取值,重新赋值.现在这些琐碎的事情都让ViewState代劳了.所以将页面post给自身的动作,在某种程度上已经被Asp.net的程序员们忘却了,所以Post也就被大部分的忽视了,这就是技术进步的双刃剑,带来方便的同时,蒙上你的眼睛。

ViewState必须包含在<form runat="server">的窗体下,而只要包含了"runat="server""的标志,就甭想Post到其他页面中去,为什么?老盖说,我的ViewState是保存当前页面状态的,你要转到其他页面,他说,不行,**不认识的参数.如果想Post一个窗体,咋办?有四种方式可供选择.

1.在页面上新建一个form,不要加上runat="server"的标志,当然在这个窗体下的控件也就不用想用Viewstate来传值了.当在其他有runat="server"的窗体的中的按钮事件中,手动调用新建form的submit() 函数.

传送页面代码如下:


<!-- 
   html代码 
   --> 
    
 
   < 
   form id 
   = 
   " 
   Form1 
   " 
    method 
   = 
   " 
   post 
   " 
    runat 
   = 
   " 
   server 
   " 
   > 
    
             
   < 
   input id 
   = 
   " 
   btnTransfer 
   " 
    type 
   = 
   " 
   button 
   " 
     onclick 
   = 
   " 
   post(); 
   " 
    runat 
   = 
   " 
   server 
   " 
   > 
    
             
   < 
   input type 
   = 
   " 
   text 
   " 
    runat 
   = 
   " 
   server 
   " 
    id 
   = 
   " 
   SourceData 
   " 
   > 
    
         
   </ 
   form 
   > 
    
         
   < 
   form id 
   = 
   " 
   forPost 
   " 
    method 
   = 
   " 
   post 
   " 
   > 
    
             
   < 
   input type 
   = 
   " 
   text 
   " 
    runat 
   = 
   " 
   server 
   " 
    id 
   = 
   " 
   SourceData2 
   " 
   > 
    
         
   </ 
   form 
   > 
    

 
   <!-- 
   Script代码 
   --> 
    
 
   < 
   script language 
   = 
   " 
   javascript 
   " 
   > 
    
             
   function 
    post() 
            { 
                forPost.action 
   = 
   " 
   DestinationPage.aspx 
   " 
   ; 
                forPost.submit(); 
            } 
         
   </ 
   script 
   >


post转换为Python 在线 post转get_服务器
post转换为Python 在线 post转get_服务器



接收页面



post转换为Python 在线 post转get_服务器string  a = Request.Form[ " SourceData2 " ].ToString();



2.通过Session取值,在一个页面中赋值,在其他页面中共享,这个方式也被广泛应用,个人不倾向于用这种方式,我怕造成Session值的混乱无序,Session用来存一些公共的东西已经累得够呛了。

3.通过Context传值,在传送页面之前,将需要传递到其他页面的值存在Context中。示例代码如下:

传送页面


// 
   点击某个button时触发 
    
 
   private 
     
   void 
    btnTransfer_ServerClick( 
   object 
    sender, EventArgs e) 
         
    
   { 
            Context.Items["SourceData"]=SourceData.Value; 
            Server.Transfer("DestinationPage.aspx"); 
        }


接收页面



string 
    a 
   = 
   Context.Items[ 
   " 
   SourceData 
   " 
   ].ToString();



4.通过Server.Transfer的方式。
这个方式在方法三种已经用到了,不过可以在调用页面为要传递到被调用页面的值创建属性(当然可以直接将它设成public),这样就可以在其他页面访问了。

传送页面



post转换为Python 在线 post转get_服务器/

/ 
   要传送的值 
    
 
   private 
     
System.Web.UI.HtmlControls.HtmlInputText SourceData; 

 
   public 
     
   string 
    getSourceData 
 
    
   { 
  get 
  { 
    return SourceData.Value; 
  } 
} 
    

 
   // 
   传送页面 
    
 
   Server.Transfer( 
   " 
   DestinationPage.aspx 
   " 
   );


接收页面


private 
    SourceClass sourcePage; 

sourcePage 
   = 
   (SourceClass)Context.Handler; 
             
   string 
    aa 
   = 
   sourcePage.getSourceData;



以上就是Post的在不同页面传递数据的方式了。
下面是get方法
我常用的是  传送页面


string 
    aa 
   = 
   SourceData.Value; 
             
   string 
    bb 
   = 
   SourceData.Value; 

             
   string 
    url 
   = 
   " 
   DestinationPage.aspx?parameter1= 
   " 
   + 
   aa 
   + 
   " 
   ¶meter2= 
   " 
   + 
   bb; 
            Response.Redirect(url, 
   false 
   );


接收页面

string 
    aa 
   = 
   Request.QueryString[ 
   " 
   parameter1 
   " 
   ].ToString(); 
             
   string 
    bb 
   = 
   Request.QueryString[ 
   " 
   parameter2 
   " 
   ].ToString();




至于 Response.Redirect(url,false)里的false都是Response.End()这个方法惹的祸,老盖说,写成false就好了,因为默认是true。我都转向其他页面了,还不让我终止原来页面的响应,BT!