zoukankan      html  css  js  c++  java
  • [转]Post和Get的区别(兼谈页面间传值的方式)

     源文:http://www.cnblogs.com/Farseer1215/articles/124896.html

    从一个页面转向另一个页面的请求方式有两种,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>


    接收页面

    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),这样就可以在其他页面访问了。

    传送页面

    //要传送的值
    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+"&parameter2="+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!

  • 相关阅读:
    performance benchmark : memcached vs Kyoto Tycoon
    Adhesive框架系列文章应用程序信息中心模块实现
    神奇的Redis
    使用代码测试ASP.NET MVC2执行流程
    linq2sql代码大全
    7/17博客园活动浅谈网站架构中缓存的应用所有资料
    浅谈.NET下的多线程和并行计算(十四)并行计算前言
    公司.NET 3.5培训资料分享
    mongodb分片集群(sharding with replica set)配置
    mongodb有关的研究
  • 原文地址:https://www.cnblogs.com/anorthwolf/p/1618684.html
Copyright © 2011-2022 走看看