ASP.NET中页面传值技巧

在ASP.NET中有几种基于页面间的传值方法:常见的有QueryString.这种方法最简单不过了,但缺点就是它把要传送的值显示在地址栏中,若是对于在安全性的信息来讲这并非一种好的解决方案。还有一个缺点就是它不能传对象。这种方法适合于传送一个简单的值及安全性不大重要的信息。例: 
  有两个页面:WebForm1.aspx,WebForm2.aspx。 
  在WebForm1.aspx.cs的某些事件中放置以下代码: 
  string url="WebForm2.aspx?name="+this.txtname.Text; 
  Response.Redirect(url); 
 接着关键时刻出现了:在WebForm2.aspx.cs中某些事件中放置以下代码: 
 lblname.Text=Request.QueryString["name"]; 
 OK! 整个传值过程完成!html

  还有一种是利用Session变量来传值,这种也比较经常使用。利用Session比较灵活,能够
在多个页面间进行传值。当调用其remove后,Session即失效。一样用两张页面举个例:
WebForm1.aspx.cs中写入以下代码:
Session["name"]=txtname.Text; 
Response.Redirect("WebForm2.aspx");
下面在WebForm1.aspx.cs中取出Session的值:
lblname.Text=Session["name"].ToString(); //由于取出来的是一个对象,因此必须转换类型
Session.Remove("name");? //使Session失效。ajax

第三种方式是利用Request对象来取值,(注:这里使用的是html控件)这种比较简洁。实现以下:数组

在WebForm1.aspx中:浏览器

Name:安全

?服务器

在WebForm2.aspx.cs中某个事件写入:Response.Write(Request.Form["txtname"]);cookie

当点击submit按钮后,即经过Request.Form[”txtname”]取出了值,
session

 

第四种方法是利用Server对象的Transfer()方法来传值,它接收一个页面对象。并发

下面用代码来说解一下这种实现方式:app

在WebForm1.aspx 的某个事件中写入以下代码:Server.Transfer("WebForm2.aspx"); //传递页面对象
接着就能够在WebForm2.aspx.cs中获取WebForm1的页面对象。
if(Context.Handler is WebForm1) //判断传递过来的是否WebForm1,由于可能会有多个传递对象。 

WebForm1 f1=(WebForm1)Context.Handler; //经过Context.Handler来建立一个WebForm1的页面对象,返 回一个object 
Response.Write("Hey,I get it with Context Handler "+((TextBox)f1.FindControl("TextBox1")).Text+"

");?? 

//最后经过调用WebForm1对象的FinControl()方法来查找WebForm1中名为"TextBox1"的一个文本控件,在此也能够换成其它的控件,无论查找的是哪种控件,都必须将其强制转换为其类型,本示例中为TextBox,最后调用其属性Text,获取在TextBox1中的值,达到传值的效果。
这种方法一样很灵活,能够传递多个页面对象,而不是传递值,所以当获取到页面对象的时候就能够获取此页面对象中的某些控件的值或其它的数据。

(注:以上几种方法,除了Request.Form()这种传值方法使用的是HTML控件外,其它几种都是使用WEB控件)



  页面传值是学习asp.net初期都会面临的一个问题,总的来讲有页面传值、存储对象传值、ajax、类、model、表单等。可是通常来讲,经常使用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。

 

  1、QueryString

  QueryString是一种很是简单的传值方式,他能够将传送的值显示在浏览器的地址栏中。若是是传递一个或多个安全性要求不高或是结构简单的数值时,可使用这个方法。可是对于传递数组或对象的话,就不能用这个方法了。

  这种方法的优势:1.使用简单,对于安全性要求不高时传递数字或是文本值很是有效。
  这种方法的缺点:1.缺少安全性,因为它的值暴露在浏览器的URL地址中的。
          2.不能传递对象。

  使用方法:1.在源页面的代码中用须要传递的名称和值构造URL地址。
       2.在源页面的代码用Response.Redirect(URL);重定向到上面的URL地址中。
       3.在目的页面的代码使用Request.QueryString["name"];取出URL地址中传递的值。

  例子:(1)a.aspx

private void Button1_Click(object sender, System.EventArgs e) 
{ 
  string s_url; 
  s_url = "b.aspx?name=" + Label1.Text; 
  Response.Redirect(s_url); 
}

  (2)b.aspx

private void Page_Load(object sender, EventArgs e) 
{ 
  Label2.Text = Request.QueryString["name"]; 
}

 

  2、Session

  想必这个确定是你们使用中最多见的用法了,其操做与Application相似,做用于用户我的,因此,过量的存储会致使服务器内存资源的耗尽。

  优势:1.使用简单,不只能传递简单数据类型,还能传递对象。
     2.数据量大小是不限制的。

  缺点:1.在Session变量存储大量的数据会消耗较多的服务器资源。

     2.容易丢失。

  使用方法:1.在源页面的代码中建立你须要传递的名称和值构造Session变量:Session["Name"]="Value(Or Object)";

       2.在目的页面的代码使用Session变量取出传递的值。Result = Session["Nmae"]

  注意:session不用时能够销毁它,销毁的方法是:清除一个:Session.Remove("session名");

                         清除全部:Session.Clear();

  例子:(1)a.aspx

private void Button1_Click(object sender, System.EventArgs e) 
{ 
  Session["name"] = Label.Text; 
}

  (2)b.aspx

private void Page_Load(object sender, EventArgs e) 
{ 
  string name; 
  name = Session["name"].ToString(); 
}

 

  3、Cookie

  这个也是你们常使用的方法,Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,好比用户访问某网站时用户的ID,用户的偏好等,用户下次访问就能够经过检索得到之前的信息。因此Cookie也能够在页面间传递值。Cookie经过HTTP头在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,若是想在Cookie存储整数值,那么须要先转换为字符串的形式。

  与Session同样,其是什对每个用户而言的,可是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。并且Cookie的使用要配合ASP.NET内置对象Request来使用。

  优势:1.使用简单,是保持用户状态的一种很是经常使用的方法。好比在购物网站中用户跨多个页面表单时能够用它来保持用户状态。

  缺点:1.经常被人认为用来收集用户隐私而遭到批评。

     2.安全性不高,容易伪造。

  

  使用方法:1.在源页面的代码中建立你须要传递的名称和值构造Cookie对象:

HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
Response.Cookies.Add(cookie);

      2.在目的页面的代码使用Cookie对象取出传递的值:Result = Request.Cookies[ "myCookie" ].Value;

  例子:(1)a.aspx

private void Button1_Click(object sender, System.EventArgs e)
{
  HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
  Response.Cookies.Add(objCookie); 
}

  (2)b.aspx

string myName1Value;
myName1Value = Request.Cookies[ "myCookie" ].Value;

 

  4、Application

  Application对象的做用范围是整个全局,也就是说对全部用户都有效。它在整个应用程序生命周期中都是有效的,相似于使用全局变量同样,因此能够在不一样页面中对它进行存取。它和Session变量的区别在于,前者是全部的用户共用的全局变量,后者是各个用户独有的全局变量。

  可能有人会问,既然全部用户均可以使用application变量,那他能够用在什么场合呢?这里举个例子:网站访问数。多个请求访问时均可以对它进行操做。

  优势:1.使用简单,消耗较少的服务器资源。

     2.不只能传递简单数据,还能传递对象。

     3.数据量大小是不限制的。

  缺点:1.做为全局变量容易被误操做。因此单个用户使用的变量通常不能用application。

  使用方法:1.在源页面的代码中建立你须要传递的名称和值构造Application变量:Application["Nmae"]="Value(Or Object)";

       2.在目的页面的代码使用Application变量取出传递的值。Result = Application["Nmae"]

  注意:经常使用lock和unlock方法用来锁定和解锁,为了防止并发修改。

  例子:(1)a.aspx

private void Button1_Click(object sender, System.EventArgs e) 
{ 
  Application["name"] = Label1.Text; }

  (2)b.aspx

复制代码

private void Page_Load(object sender, EventArgs e) 
{ 
  string name; 
  Application.Lock(); 
  name = Application["name"].ToString(); 
  Application.UnLock(); 
}

复制代码

 

  5、Server.Transfer

  这个才能够说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另外一个页面中,新的页面使用前一个页面的应答流,因此这个方法是彻底面象对象的,简洁有效。

  Server.Transfer是从当前的ASPX页面转到新的ASPX页面,服务器端执行新页并输出,在新页面中经过Context.Handler来得到前一个页面传递的各类数据类型的值、表单数据、QueryString.因为重定向彻底在服务器端完成,因此客户端浏览器中的URL地址是不会改变的。调用Server.Transfer时,当前的ASPX页面终止执行,执行流程转入另外一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面建立的应答流。

  ps:比较Server.Transfer和Response.Redirect的区别。
    (1)Server.Transfer在服务器端完成,因此客户端浏览器中的URL地址是不会改变的;Response.Redirect是客户端完成,向服务器端提出新的页面处理请求,因此客户端浏览器中的URL地址是会改变的。
    (2)Server.Transfer在服务器端完成,不须要客户端提出请求,减小了客户端对服务器端提出请求。[2]
    (3)Server.Transfer只可以转跳到本地虚拟目录指定的页面,也就是工程项目中的页面,而Response.Redirect则十分灵活,能够跳转到任何URL地址。
    (4)Server.Transfer能够将前一个页面的各类类型的值传到新的页面;Response.Redirect则只能借助URL中带参数或是结合上面四种办法把各类类型的值传到新的页面。

  优势:1.直接在服务器端重定向,使用简单方便,减小了客户端对服务器端提出请求。

     2.能够传递各类数据类型的值和控件的值。

  缺点:1.客户端浏览器中的URL地址是不改变,会致使在新的页面可能出现一些意想不到的问题。好比若是源页面和目的页面不在同一个虚拟目录或其子目录下,那么使用相对路径的图片、超连接都会致使错误的指向。

  使用方法:1.在源页面的代码中,使用Page类的Server.Transfer跳到另外一个页面传递页面数据:Server.Transfer("b.aspx","false")。

       2.在目的页面中,使用Context.Handler来接收数据:FormerPage formerPage = (FormerPage)Context.Handler; 而后用formerPage的属性和方法来获取前一个页面的值,或者直接用Context.Items["myParameter "]

  例子:(1)a.aspx

复制代码

public string Name 
{ 
  get{ return Label1.Text;} 
} 
private void Button1_Click(object sender, System.EventArgs e) 
{ 
  Server.Transfer("b.aspx"); 
}

复制代码

    (2)b.aspx

复制代码

private void Page_Load(object sender, EventArgs e) 
{ 
  a newWeb; //实例a窗体   newWeb = (source)Context.Handler; 
  string name; 
  name = newWeb.Name; 
}

复制代码

 

  以上就是经常使用的几种页面间传值的方法,我通常使用session和querystring来传值,少数状况会使用到cookie。本篇文章仅仅是介绍这几种方法的使用方法,内部原理没有过多的解释,关于session的存储方式请参见:session的存储方式和配置