经常在开发中遇到一个问题,上一个页面需要向下面一个页面传递一些值以做出不同的处理,如果数量比较少的话可以用在要传递的页面后面加?然后写参数,但是如果需要传递的值很多很多,或者理解为一个数组,这个时候应该怎么办呢?如果在第一个页面中用一个全局静态数组是可以,但是这种做法显然是不合要求的,在多人同时情况下就出错了,正确的做法应该怎么弄呢?传递一个数组名过去好像也不行,.net中好像不流行指针....另外:一个页面中定义了一个字段并给他赋值(不是static形的),但是只要一点任何一个按钮后这个值就不在了,也就是说post了一次以后类被重新初始化了,所有的字段也清空了,如果我想保留一些临时数据又不想放到数据库中,该怎么办?用xml?或者新建立一个类? 小弟太笨,分都问光了,-_-!最后那么点分了,还是希望大家可以帮忙,谢谢!!

解决方案 »

  1.   

    1.頁面傳值很多方法.看你第一种情況.可以用.
    Server.transfer().
    具体用法查一下就行了
    2.可以用. ViewState["名"] = 存的值
      

  2.   

    补充:第2个问题中有的朋友说用一个Session或者把值都放到控件里面去,都是可以的,想知道的谁有用xml实现的方法~
      

  3.   


    ASP.NET页面间的传值的几种方法 
    作者:Powered by DvNews.net 来自:http://www.uncj.net/news/show.aspx?id=69 ASP.NET WEB FORMS 给开发者提供了极好的事件驱动开发模式。然而这种简单的应用程序开发模式却给我们带来了一些小问题,举个例子,在传统的ASP应用程序中,你能够通过POST方法很容易的把一个值或多个值从一个页面传送到另一个页面,用同样的方法在ASP.NET中实现有点麻烦。在这里,我们可以通过其他方式来解决这种情形。ASP.NET为我们提供了三种方式,一种是可以通过用QueryString来传送相应的值,再一种是通过session变量来传送相应的值,还有就是通过Server.Transfer方法来实现。下面分别一一介绍: 一、使用Querystring 
    Querystring是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象。如果你想传递一个安全性不是那么太重要或者是一个简单的数值时,用此方法最好不过了。下面通过一个小例子来完成传值工作,步骤如下: 
    1、创建一个web form 
    2、在新建的web form中放置一个button1,在放置两个TextBox1,TextBox2 
    3、为button按钮创建click事件 
    代码如下: 
    private void Button1_Click 
    (object sender, System.EventArgs e) 

    string url; 
    url="webform2.aspx?name=" + 
    TextBox1.Text + "&email=" + 
    TextBox2.Text; 
    Response.Redirect(url); 

    4、新建一个目标页面命名为webform2 
    5、在webform2中放置两个Label1,Label2 
    在webform2的Page_Load中添加如下代码: 
    private void Page_Load 
    (object sender, System.EventArgs e) 

    Label1.Text=Request.QueryString["name"]; 
    Label2.Text=Request.QueryString["email"]; 

    运行,即可看到传递后的结果了。 二、使用Session变量 使用Session变量传值是一种最常见的方式了,此中方式不仅可以把值传递到下一个页面,还可以交叉传递到多个页面,直至把Session变量的值removed后,变量才会消失。举个例子看看: 
    1、创建一个web form 
    2、在新建的web form中放置一个button1,在放置两个TextBox1,TextBox2 
    3、为button按钮创建click事件 
    代码如下: 
    private void Button1_Click 
    (object sender, System.EventArgs e) 

    Session["name"]=TextBox1.Text; 
    Session["email"]=TextBox2.Text; 
    Response.Redirect("webform2.aspx"); 

    4、新建一个目标页面命名为webform2 
    5、在webform2中放置两个Label1,Label2 
    在webform2的Page_Load中添加如下代码: 
    private void Page_Load 
    (object sender, System.EventArgs e) 

    Label1.Text=Session["name"].ToString(); 
    Label2.Text=Session["email"].ToString(); 
    Session.Remove("name"); 
    Session.Remove("email"); 

    运行,即可看到传递后的结果了。 三、使用Server.Transfer 
    虽然这种方法有点复杂,但也不失为一种在页面传值的方式。 
    举个例子看看: 
    1、创建一个web form 
    2、在新建的web form中放置一个button1,在放置两个TextBox1,TextBox2 
    3、为button按钮创建click事件 
    代码如下: 
    private void Button1_Click 
    (object sender, System.EventArgs e) 

    Server.Transfer("webform2.aspx"); 

    4、创建过程来返回TextBox1,TextBox2控件的值代码如下: 
    public string Name 

    get 

    return TextBox1.Text; 

    } public string EMail 

    get 

    return TextBox2.Text; 


    5、新建一个目标页面命名为webform2 
    6、在webform2中放置两个Label1,Label2 
    在webform2的Page_Load中添加如下代码: 
    private void Page_Load 
    (object sender, System.EventArgs e) 

    //创建原始窗体的实例 
    WebForm1 wf1; 
    //获得实例化的句柄 
    wf1=(WebForm1)Context.Handler; 
    Label1.Text=wf1.Name; 
    Label2.Text=wf1.EMail; } 
    运行,即可看到传递后的结果了。  
      

  4.   

    回楼上的,Server.Transfer是服务器重定向,好像不能传递大量数据的问题。
    ViewState和用Session或Cashe有什么区别吗?
      

  5.   

    谢谢engine198473的资料,是否有传递大量数据的例子呢?如果上百个数据全部通过网址后面?后面那串东西来传一个一个写会不会太累,如果我要传递的东西是一个数组呢?
      

  6.   

    viewstate是页面上的隐藏控件,它是随着页面一起传输的,在局域网条件下随便用,上互联网就不能这么用了,会很痛苦的。你通过浏览器打开页面源代码,看到有一大段乱七八糟的字符和数字,那就是viewstate的值。
    session是服务器段保存的数据,它通过浏览器访问时产生的sessionid来确定状态,它的所有内容都保存在服务器上,而且会在session过期前一直保留,比较占用服务器空间,如果你的系统的并发数比较少,随便用session无所谓,如果同时在线超过1000的话,就不要用了,服务器会死的很惨。
    cache不太清楚,没有用过。网址传送的数据很有限,上百个数据肯定不适用,一个一个写可以用循环,不会很累。
    如果传递一个数组,还是用viewstate或session吧,具体什么情况用哪个我前面已经说了。
      

  7.   

    下面挨个回答你的问题:
    经常在开发中遇到一个问题,上一个页面需要向下面一个页面传递一些值以做出不同的处理,如果数量比较少的话可以用在要传递的页面后面加?然后写参数,但是如果需要传递的值很多很多,或者理解为一个数组,这个时候应该怎么办呢?
    如果你以前用过asp、jsp、php、pl、cgi等等就不会有此一问了,常规的做法,页面提交多数都是提交给下一个页面而非当前页面的,只有到.NET出现后,才会让大家以为,所有内容都是提交给自己的。
    当然,.NET里面也可以模仿以前的方法,把页面内容提交到下其他页面,但是这时候,form的runat属性就要去掉,而且原来没有的action、method属性都要添上。
    其实提交是要传输很多东西的,比如我这里发出回复,页面就要把文本框里全部文字都提交上去,这可不比你的数组内容少吧。如果在第一个页面中用一个全局静态数组是可以,但是这种做法显然是不合要求的,在多人同时情况下就出错了,正确的做法应该怎么弄呢?传递一个数组名过去好像也不行,.net中好像不流行指针....
    正确的做法就是提交到一个新的页面里,而不是在当前页面处理,也可以说,这个aspx页完全可以改成html页。另外:一个页面中定义了一个字段并给他赋值(不是static形的),但是只要一点任何一个按钮后这个值就不在了,也就是说post了一次以后类被重新初始化了,所有的字段也清空了,如果我想保留一些临时数据又不想放到数据库中,该怎么办?用xml?或者新建立一个类? 
    这个是必然的,网页无连接,服务器把页面传给你以后就把相关内存全部释放了,不会保留。你保留这些临时数据就用几种方法:cookie、viewstate、session。用xml或者新建类都不行。
      

  8.   

    楼上的兄弟果然厚道,感动~~但是我还有一处没有明白,用Session传递一个数组可以吗?代码要怎么写?一直以来都是Session["name"]=value这样的用法,数组要怎么放进去?
      

  9.   

    要是真的好多好多.干脆向XML文件或数据库里写
      

  10.   

    还是没有获得我想要的东西,虽然学到了很多,现在只想知道一个页面向下一个页面传一个数组a[]的办法~~~
    .Net技术讨论群14272327,欢迎菜鸟们加入,欢迎高手指导~
      

  11.   

    session里面什么都能放,不但能放值,也可以放对象,它会自动记录对象的类型。
    只要在使用的时候,用ctype函数把它再重新指定回某个数据类型就可以了。
      

  12.   

    关于传递数组,我还真没试过,很久很久都没使用过数组了。-_-!!!不过现在.NET里面有很方便的办法可以把数组转化成字符串,把字符串分隔成数组,就是split和join两个函数。不妨一试。