在两个ASP.NET页面之间传递值
引言 ASP.NET提供了卓越的事件驱动编程模型,让开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,使用传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递值,同样的事情,在使用事件驱动编程模型的ASP.NET就不是那么容易了,当然了,我们仍然有一些方法可以实现同样的功能。本文将试着使用不同的可能的方法来解决这个问题,但可以预见是,本文将包含使用querystring,session变量以及server.Transfer方法来实现页面间的值传递。
使用QueryString 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在传递的值少而安全性要求不高的情况下,这个方法还是一个不错的方案。使用这种方法的步骤如下: 1,使用控件创建web表单(form) 2,创建可以返回表单的按钮和链接按钮 3,在按钮或链接按钮的单击事件里创建一个保存URL的字符变量 4,在保存的URL里添加QueryString参数 5,使用Response.Redirect重定向到上面保存的URL 下面的代码片断演示了如何实现这个方法: 源页面代码: private void Button1_Click(object sender, System.EventArgs e) { // 习惯上先定义 string url; // 拼字符串 url="anotherwebform.aspx?name=" + TextBox1.Text + "&email=" + TextBox2.Text; Response.Redirect(url); } 目标页面代码: private void Page_Load(object sender, System.EventArgs e) { Label1.Text=Request.QueryString["name"]; Label2.Text=Request.QueryString["email"]; }
使用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(); }
使用Session变量 使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下: 1,在页面里添加必要的控件 2,创建可以返回表单的按钮和链接按钮 3,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里 4,使用Response.Redirect方法重定向到另一个页面 5,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它 下面的代码片断演示了如何实现这个方法: 源页面代码: private void Button1_Click(object sender, System.EventArgs e) { //textbox1 and textbox2 are webform //controls Session["name"]=TextBox1.Text; Session["email"]=TextBox2.Text; Server.Transfer("anotherwebform.aspx"); } 目标页面代码: 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"); }
使用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(); }
使用Server.Transfer(传递) 这个方法相比上面介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下: 1,在页面里添加必要的控件 2,创建返回值的Get属性过程 3,创建可以返回表单的按钮和链接按钮 4,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面 5,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了 以下代码综合实现上述步骤过程的代码: 源页面代码: 把以下的代码添加到页面中 public string Name { get { return TextBox1.Text; } }
public string EMail { get { return TextBox2.Text; } } 然后调用Server.Transfer方法 private void Button1_Click(object sender, System.EventArgs e) { Server.Transfer("anotherwebform.aspx"); } 目标页面代码: private void Page_Load(object sender, System.EventArgs e) { //create instance of source web form WebForm1 wf1; //get reference to current handler instance wf1=(WebForm1)Context.Handler; Label1.Text=wf1.Name; Label2.Text=wf1.EMail; }
总结 本文讲述了使用不同的方法实现了ASP.NET页面间值传递,这三种方法是:QueryString,Session和Server.Transfer,我们应该反覆体会几种方法的异同 我希望本文能给你有用的助益,直到在你的代码中运用自如!
Session变量显然不是很好,因为两个页面之间最好还是使用局部变量。否则如Meyer所说,可能会有项目组中Session命名冲突的问题。 QueryString的方法似乎比较古老,要手工去拼一个字符串也挺麻烦的。 Server.Transfer的方法居然有这么多人说好,这种方法要求被调用的页面去引用调用的页面,这种方法明显违反编程的原则。原来被调用的页面可以独立使用,可以被其他页面调用,用了这种方法就不行了!!!
继续查询,原来asp.net还有这么多种方法来维持状态: Application显然不行,因为是全局的。同理,配置文件的方法也不行。 cookie的方法也排除。 Context,Session,QueryString的方法前面已经讨论过了。
剩下的可以选择的方法:Form Post,Cache,ViewState Form Post似乎也是ASP时代的方法。暂时不考虑。 ViewState适用在一个页面中保存状态,要在两个页面之间使用似乎也不行。
最后只要选择Cache. 其实我也不是在两个ASP.NET之间传递数据,而是在ASP.NET页面和ASP.NET用户控件之间传递数据。用户控件是动态装入的。作如下试验:在ASP.NET页面中装入用户控件的时候 Cache["Test"] ="Test" 在用户控件的Page_Load方法中: Label1.Text = Page.Page.Cache["Test"].ToString; 成功:Label1显示为“Test”.
但是Meyer的项目似乎用的是ViewState。疑惑中...... 禁止在页面中使用static变量 今天,项目出现了问题,从表现看像是串Session,我们的Session变量使用的并不多。而且这个现象能够必然的重现。因为是别的组的程序我也没怎么去查。后来他来问我,Session没有问题,是static变量出了问题。static变量!!!我一下就敏感起来。然后去看他的代码。My God!一堆的static变量。其实都应该用ViewState来保存的。
我以前给项目组的人解释 ViewState、Session、Application、static Member的时候说“不要在页面使用static变量,除非你自己确实清楚你在干什么。static变量和Application类似,而不是和Session一样。”。我现在的要求是“禁止在页面中使用static变量”。说得很绝对。
强调“禁止在页面中使用static变量”,出于以下原因。 一、 我怕还有人自以为很清楚,结果滥用static变量。而这种理解错误的后果很大。 二、 这是学习asp.net的人,很多人都会犯的错误(在csdn上老看到与此相关的问题)。 三、 C#语言的书,在讲授static Member的时候,都使用Console或则winform程序。给学习者在asp.net中的使用造成了误解。 四、 禁止使用static变量,合适的地方就会使用Application对象。而这个东东一般是在asp.net或者asp的书中提到,对他理解错误的人不多。 五、 asp.net的实际应用中static变量的作用极少,而对于极少几个可能会使用的地方,一般提供单件类更合适。
BTW: 我对ViewState的使用不怎么规定,但我自己一般会提供property来包装ViewState的使用。 使用Session我决定提供一个SessionHelper类来包装所有使用到的Session,禁止在页面中直接使用Session["dfdf"]这种方式。因为多人的工程会导致Session命名的冲突,这样要求一来容易查到冲突的命名,二来对冲突也容易修改。关键是Session也不是什么好东西,要有节制的使用。这样利于管理整个项目中使用的Session。贯彻这个要求也很容易,对项目中的文件搜一下'Session',就能很容易的找出违反规定的代码:D。 对于Application我也是提供包装,跟Session的使用要求相似。
|
请发表评论