关于页面传值的方法,引发了很多讨论。看来有很多人关注这个,我就我个人观点做了些总结,希望对大家有所帮助。 1.  使用QueryString变量QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面是一个例子:a.aspx的C#代码private void Button1_Click(object sender, System.EventArgs e)
{
    string s_url;
    s_url = "b.aspx?name=" + Label1.Text;
    Response.Redirect(s_url);
}b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
    Label2.Text = Request.QueryString["name"];
}2.  使用Application 对象变量Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。a.aspx的C#代码private void Button1_Click(object sender, System.EventArgs e)
{
    Application["name"] = Label1.Text;
    Server.Transfer("b.aspx");
}b.aspx中C#代码private void Page_Load(object sender, EventArgs e)
{
    string name;
    Application.Lock();
    name = Application["name"].ToString();
    Application.UnLock();
}3.  使用Session变量想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。a.aspx的C#代码private void Button1_Click(object sender, System.EventArgs e)
{
    Session["name"] = Label.Text;
}b.aspx中C#代码private void Page_Load(object sender, EventArgs e)
{
    string name;
    name = Session["name"].ToString();
}4.  使用Cookie对象变量这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。a.aspx的C#代码private void Button1_Click(object sender, System.EventArgs e)
{
    HttpCookie cookie_name = new HttpCookie("name");
    cookie_name.Value = Label1.Text;
    Reponse.AppendCookie(cookie_name);
    Server.Transfer("b.aspx");
}b.aspx中C#代码private void Page_Load(object sender, EventArgs e)
{
    string name;
    name = Request.Cookie["name"].Value.ToString();
}5.  使用Server.Transfer方法这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。a.aspx的C#代码public string Name
{
    get{ return Label1.Text;}
}
private void Button1_Click(object sender, System.EventArgs e)
{
    Server.Transfer("b.aspx");
}b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
    a newWeb;   //实例a窗体
    newWeb = (source)Context.Handler;
    string name;
    name = newWeb.Name;
}

解决方案 »

  1.   

    传值方法比较多
    我在添加一个
    Cross-Page Posting定位至于源网页位于相同的应用程序的网页,可以读取源网页的值和公共属性,但是不要按浏览器中的重新整理和上一步,这样会照成无法预期的效果
    eg:
    aspx
      <div>
            您的名字:<asp:TextBox ID="name" runat="server"></asp:TextBox>
            <asp:Button ID="btn_name" runat="server" PostBackUrl="~/Cross-Page Posting/CrossPageTarget.aspx"
                Text="传送" OnClick="btn_name_Click" />
        
        </div>
    cs:
    TextBox name = (TextBox)PreviousPage.FindControl("name");//非public 成员
            Label1.Text = "欢迎你:" + name.Text;previouspage本身属于page类,并且只有在来源网页和目标网页属于同一个asp.net应用程序下的时候才能引用,如果网页不是跨网页公布的目标,或者是网页在不同的应用程序之中,就不会初始化previouspage属性,就不能使用previouspage来存取任何信息获得网页的公共属性:source.cs:public string UserName{     get{return aa.text;}}cross-page posting.aspx:<%@ PreviousPageType VirtualPath="~/Cross-Page Posting/Source.aspx"%>cross-page posting.cs:lab.text = previousopage.username;//一个网页中只能指示一个previousPage,不然出出现编译错误
      

  2.   

    长见识了,初学者,只用过QueryString,session,cookie这3种~
      

  3.   

    你只说了在服务器端的传值方法,其实 客户端 一样可以传值得。对使用 window.open 打开的页面,子页面中可以使用 parent 来取得父窗体,然课可以任意取得父窗体中的控件得值,甚至可以直接掉重负窗体中的函数。针对很多开发,使用这种方法比在服务器端传值更实用。还可以调用父窗体的 _dopostback,让父窗体提交。等等
    针对 有 frame或者iframe的页面,可以任意调用。
    跨页面调用一般不能跨域。
    跨页面调用是一种很常用的方法
      

  4.   

    其实 就是一种公用,说白了就是数据共享的一种方式。比如 application session cookie 等都是数据共享。如果说数据共享,传值 还有更多的方式,
    比如 数据库。把数据存入 数据库,别的页面都可以访问,。net的状态保持 就有 数据库方式的。还可以使用xml来存储数据,进行传值,等等。
    这涉及到 编程中的 很多深层次的东西。比如设计模式,使用 adapter模式,把数据存在某一个地方,多个接口共享,这就是数据交互放的的共享方式。等等,可以扩充一下思维。
      

  5.   

    传值 一般要用变量传值,不然容易被sql 注入
      

  6.   

    针对SQL诸如可以使用一种简单的办法来处理,就是使用 encode,读出来的时候 decode ,把特殊字符,SQL 关键字等 加密一下就好了。
      

  7.   

    楼主的QueryString传值方法遇到特殊字符怎么办?
    要用编码和解码!private void Button1_Click(object sender, System.EventArgs e) 

             
        Response.Redirect("b.aspx?name=" + Server.UrlEncode(nam) + ""); 
    } b.aspx中C#代码 
    private void Page_Load(object sender, EventArgs e) 

        Label2.Text = Server.UrlDecode(Request.QueryString["name"].ToString()); 

     
      

  8.   

    很奇怪为什么没有提到caching呢?感觉caching比session更高效,比cookie,queryString更安全。
      

  9.   


    1. asp.net 缓存功能的不足 
    在 .net framework 中,我们用到缓存最多的地方应该就是使用 asp.net 中的缓存服务( System.Web.Caching.Cache)了。它为我们提供了强大的缓存功能,包括 Output caching, Fragment caching 以及 Data caching(后面所谈及的内容主要涉及 Data caching)。但是此缓存功能有一个很大的缺点,就是缓存的内容不能在多个 AppDomain 中共享,在 AppDomain scope, Machine scope和Application farm scope 三个级别中只实现了 AppDomain scope 一个级别。这在很多应用中是很不方便的。 比如在网站中有一个应用程序是用于用户管理的:新增、编辑用户信息等,另外还有其他一些需要用到用户信息的应用程序,比如blog、chat、forums等等。这些 web 应用程序分别是在不同的 AppDomain 里面运行的。由于用户的信息是不常更改的,而且是经常需要访问的,显然应该被存放在缓存里面。但是由于多个 AppDomain 都需要访问,使用 asp.net 中的缓存功能是很难保证用户信息被更改后能被马上应用到别的 AppDomain 里面的。如果是在 Application farm 的环境下,更是不能保证信息的同步的。 链接
      

  10.   

    5.  使用Server.Transfer方法 这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。 a.aspx的C#代码 public string Name 

        get{ return Label1.Text;} 

    private void Button1_Click(object sender, System.EventArgs e) 

        Server.Transfer("b.aspx"); 
    } b.aspx中C#代码 
    private void Page_Load(object sender, EventArgs e) 

        a newWeb;  //实例a窗体 
        newWeb = (source)Context.Handler; 
        string name; 
        name = newWeb.Name; 
    } 楼主的这个方法我试了一下,报错了,首先 这两句  
        a newWeb;  //实例a窗体 
        newWeb = (source)Context.Handler; 
    source 处就报错了,source标示什么意思? 另外,webForm不像 winform中直接实例化窗体的吧?还有一个问题像 :http://www.mall.taobao.com/go/act/sale/hampmd1chany.php?TBG=82.7c706b3c-16ec-4d08-8a3d-8a09bbfbbf9c.11&ad_id=&am_id=&cm_id=14001175258a484858f2&pm_id=  这种URL是如何实现的,加密了的?
      

  11.   

    还有静态属性的方法
    a.aspx的C#代码 
    public class a : Page{
    public static int aaa;
    private void Button1_Click(object sender, System.EventArgs e) 

        aaa = 123;

    }b.aspx中C#代码 
    private void Page_Load(object sender, EventArgs e) 

        Label2.Text = a.aaa;
      

  12.   

    [Quote=引用楼主 y82907966 的帖子:]
    5.  使用Server.Transfer方法 这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。 a.aspx的C#代码 public string Name 

        get{ return Label1.Text;} 

    private void Button1_Click(object sender, System.EventArgs e) 

        Server.Transfer("b.aspx"); 
    } b.aspx中C#代码 
    private void Page_Load(object sender, EventArgs e) 

        a newWeb;  //实例a窗体 
        newWeb = (source)Context.Handler; 
        string name; 
        name = newWeb.Name; 
    } 这个b页没法实例化
      

  13.   

    数据共享方式:剪贴板、xml、数据库。
    公共类型存储静态类等存放复杂对象。
      

  14.   

    楼主把“使用Server.Transfer方法 ”再讲讲吧,看的不是很明白
      

  15.   

    最后一个“使用Server.Transfer方法”真的可行吗?用过lZ说的其他方法,这个...确定可行?
      

  16.   

    页面接交依我看主要有三种:
    1.GET提交:URL和RESPONOSE重定向
    2.POST提交:Server.Transfer,表单提交和跨页数据提交
    3.COOKIE SESSION APPLICATION 等
          
      

  17.   


    这里改下a newWeb; //实例a窗体 
    newWeb = (a)Context.Handler; 应该没问题了