ASP.NET跨页面传值的几种方法
1. 使用QueryString变量
QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面是一个例子:
1 private void Button1_Click(object sender, System.EventArgs e) 2 { 3 string s_url; 4 s_url = "b.aspx?name=" + Label1.Text; 5 Response.Redirect(s_url); 6 }
1 private void Page_Load(object sender, EventArgs e) 2 { 3 Label2.Text = Request.QueryString["name"]; 4 }
2. 使用Application 对象变量
Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。
1 private void Button1_Click(object sender, System.EventArgs e) 2 { 3 Application["name"] = Label1.Text; 4 Server.Transfer("b.aspx"); 5 }
1 private void Page_Load(object sender, EventArgs e) 2 { 3 string name; 4 Application.Lock(); 5 name = Application["name"].ToString(); 6 Application.UnLock(); 7 }
3. 使用Session变量
想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。
1 private void Button1_Click(object sender, System.EventArgs e) 2 { 3 Session["name"] = Label.Text; 4 }
1 private void Page_Load(object sender, EventArgs e) 2 { 3 string name; 4 name = Session["name"].ToString(); 5 }
4. 使用Cookie对象变量
这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。
1 private void Button1_Click(object sender, System.EventArgs e) 2 { 3 HttpCookie cookie_name = new HttpCookie("name"); 4 cookie_name.Value = Label1.Text; 5 Reponse.AppendCookie(cookie_name); 6 Server.Transfer("b.aspx"); 7 }
1 private void Page_Load(object sender, EventArgs e) 2 { 3 string name; 4 name = Request.Cookie["name"].Value.ToString(); 5 }
5. 使用Server.Transfer方法
这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。
1 public string Name 2 { 3 get{ return Label1.Text;} 4 } 5 private void Button1_Click(object sender, System.EventArgs e) 6 { 7 Server.Transfer("b.aspx"); 8 }
1 private void Page_Load(object sender, EventArgs e) 2 { 3 a newWeb; //实例a窗体 4 newWeb = (source)Context.Handler; 5 string name; 6 name = newWeb.Name; 7 }
6. 使用 Request.Form 方法
1、Request.Form 获取窗体变量集合。有两重载,即Request.Form[string name]和Requst.Form[int index]。
2、获取表单指定名字的参数值。
1 protected void getQueryString_Click(object sender, EventArgs e) 2 { 3 string strQueForm = Request.Form["TextBox1"]; 4 Response.Write(strQueForm); 5 }
7. 使用Cache
1、应用程序中的缓存机制用于将需要大量服务器资源来创建的对象存储在内存中,以此大大改进应用程序的性能。这个机制同样可以用来传值。
2、与其他方法不同的是,该方法需要设置缓存项优先级和缓存时间。因为当系统内存缺乏时,缓存机制会自动移除很少使用或优先级较低的项,从而造成传值失败。
3、该方法的优点是传递数据的大小和数量无限制,速度快。缺点是缓存机制的操作相对比较复杂。
1 //Class1 2 3 Cache["id"] = TextBox1.Text; 4 Response.Redirect("~/WebForm1.aspx"); 5 6 //Class2 7 8 if (Cache["id"]!=null) 9 { 10 Label1.Text = Cache["id"].ToString(); 11 } 12 13 //移除缓存 14 Cache.Remove("id"); 15 16 //如果 Cache["id"]为空,则传值失败。可使用如下方法实 17 //限期为10分钟 18 Cache.Insert("id",TextBox1.Text,null,Cache.NoAbsoluteExpiration,new TimeSpan(0,10,0));
8. 使用Context.Items["id"]
1、Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求、响应、以及上文中的Session 和Application 等信息。
2、可以使用此对象在网页之间共享信息,从而实现页面间的传值。
3、与使用 Form 的方法类似,该方法也能保持大量的数据,缺点也相同,但使用方法相对比较简单。
1 //Class1 2 3 Context.Items["id"]=TextBox1.Text; 4 Server.Transfer("~/Class2.aspx"); 5 6 //Class2 7 Label1.Text=Context.Items["id"].ToString(); 8 Context.Items.Remove("id"); //移除项
9. 使用ViewState
1、ViewState 是ASP.NET 用来在同一页面的多个请求之间保存和还原服务器控件视图状态的一种机制。与传统的“同一页面”不同,ASP.NET 中“同一页面”的
每一个请求都会导致服务器重新生成该页面,但是新生成的页面并不包含原来页面的数据。(页面无状态性)
2、ViewState 的任务就是保存原来页面中服务器控件视图状态的数据供新页面使用。从这个意义上讲,ViewState 也可以看作是一种在页面间传递数据的工具。
3、ViewState 的工作原理是:作为一个隐藏的窗体字段在客户端和服务器之间传递,可见,滥用ViewState 会加重页面回传的负担,从而降低应用程序的性能。
此外,ViewState 也能被控件、页面和应用程序禁用。
1 //Class1 2 ViewState["id"]=TextBox1.Text; //数据保存 3 Label1.Text=ViewState["id"].ToString(); //数据取出 4 ViewState.Remove("id"); //数据移除
10. 使用web.config和machine.config
1、每个Web运用程序继承web.config文件和machine.config文件的设置。
2、web.config和machine.config这两种文件保存数据一般都很小,多为明文,特别适合保存一些字符串常量,如数据库连接信息。此外,web.config文件是可以
扩展的,因此,也可以用来传递变量。由于这两种文件会被自动缓存,所以不存在因磁盘IO产生的性能瓶颈等问题。要注意的是文件中某些设置会导致文件被修改后
Web运用程序的重启。
3、web.config:你可以向单个Web运用程序运用设置。例如,你可能会希望设置特定的验证方法、调试的类型、默认语言或自定义的错误页面。但如果你要使用这些
设置,必须把web.config文件放到web运用程序的根虚拟目录下。要想在Web运用程序中进一步配置自己的子目录,需要 在这些文件夹中放置附加的web.config。
4、machine.config:从c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目录中的一个叫macine.config的文件开始 配置。machine.config
文件定义支持的配置文件节,配置ASP.NET工作者进程,注册可用于高级特性(如配置文件、成员资格以及基于角色的安全等)提供程序。
1 //Class1 2 using System.Web.Configuration; 3 WebConfigurationManager.AppSettings.Set("userName",TextBox1.Text); 4 Response.Redirect("~/Class2.aspx"); 5 //Class2 6 using System.Web.Configuration; 7 Label1.Text = WebConfigurationManager.AppSettings["userName"];
11. 使用 Static
1、这个应该是非常容易理解的,在ASP.NET中,每个页面对应一个具体的类,既然如此,那么页面之间的传递,我们就可以归结为:类与类之间数据的传递。想到这一步,问题应该
就迎刃而解了, 因为我们可以利用类之间的公关静态变量来解决这个问题。
2、若合理利用,可以有效地提高数据传递效率,但若滥用,可能会导致用户或页面间数据紊乱,存在一定风险和隐患,应谨慎使用。
1 //class1 2 public static string userName;//在class1中定义静态全局变量 3 userName=txtBoxUserName.Text; 4 Response.Redirect("~/class2.aspx"); 5 //class2 6 Label1.Text=Src.id;
12 补充常用页面之间跳转
1.最常用的页面跳转(原窗口被替代):Response.Redirect("XXX.aspx");
2.利用url地址打开本地网页或互联网:Respose.Write("<script language='javascript'>window.open('"+ url+"');</script>");
3.原窗口保留再新打开另一个页面(浏览器可能阻止,需要解除):Response.Write("<script>window.open('XXX.aspx','_blank')</script>");
4.效果同1中的另一种写法:Response.Write("<script>window.location='XXX.aspx'</script>");
5.也是原窗口被替代的 (常用于传递session变量的页面跳转):Server.Transfer("XXX.aspx");
6.原窗口保留,以对话框形式打开新窗口:Response.Write("<script>window.showModelessDialog('XXX.aspx')</script>");
7.对话框形式打开新窗口,原窗口被代替:Response.Write("<script>window.showModelDialog('XXX.aspx')</script>");
8.打开简洁窗口:Respose.Write("<script language='javascript'>window.open('"+url+"','','resizable=1,scrollbars=0,status=1,menubar=no,toolbar=no,location=no, menu=no');</script>");
9.利用vs2008端口:System.Diagnostics.Process.Start(http://localhost:3210/系统管理员.aspx);