一、使用response.Redirect
这种方式是一种最简单的传值方式,使用简单方便。但是有一个缺点,它传送的值显示在浏览器的地址栏中,如果不是传递的数据安全性不是很高,可以使用这个方法。但是对于传送数组和对象的时候,用这个方法就不可以了。
传值页面:
protected void BtSearchHistory_Click(object sender, EventArgs e)
{
Response.Redirect("attdendanceHistory.aspx?groupno="+lblgroupno.Text.Trim()+"&"+"UserRoles="+ lblUserRoles.Text.Trim());
}
接收页面:
{ // 获取传递过来的groupno和UserRoles</span>
if (Request.Params["groupno"] != null && Request.Params["groupno"].Trim() != "")
{
groupno = Request.Params["groupno"];
}
if(Request.QueryString["UserRoles"] !=null && Request.QueryString["UserRoles"].Trim() !="")
{
userRoles = Request.QueryString["UserRoles"];
}
}
缺点:
如下图,会在地址栏中显示传递值的信息,不安全。不能够传递对象
优点:
经典的传值方式,使用非常简单。
二、使用application对象变量传值
application对象的作用范围是整个全局,所以对所有的用户都有效,和其配合在一起使用的方法是Lock和Unlock,用这两个方法可以处理多个用于对存储在Application对象的写入问题。Lock方法锁定全部的Application变量,从而阻止其他用户修改Application对象的变量值。而UnLock是解除对Application对象的锁定。
传送页:
protected void Page_Load(object sender, EventArgs e)
{
//Application传值
string name;
application.lock();
name = application["name"].tostring();
label1.text = name;
application.unlock();
}
接收页: protected void Button1_Click(object sender, EventArgs e)
{
//application传值
Application["name"] = "小娟娟";
Server.Transfer("get.aspx");
}
使用场景:这种方式是通过HttpApplication对象在服务器生成一个状态来存储所需要的信息,该Httpapplication对象变量可以作用于真个web应用程序,所以该对象一般存储一些要公布的信息,而对于那些涉及到用户个人的敏感数据,就不适合用这个方式来存储。
对比Session:
Session是对于每个单独的用户,当用户关闭当前浏览器,那么Session会失效。Application 对象存储的变量是针对于所有访问程序的用户,即使有用户关闭了浏览器,变量的值也不会丢失。
三、cookie传值
cookie 是存储区在用户自己的电脑中,以文本的形式存在于磁盘中。这种方式很有意思,很多登录系统就是利用Cookie实现用户身份自动登录。用户登录一次的登录信息将被写入到用户电脑的cookie文件中,下次登录的时候,网站自动读取cookie完成用户身份验证。和seesion使用的方法差不多,但是cookie是存放在客户端的,session是存放在服务器端的,cookie的使用要配合AsP.net内置对象request来使用。
需要注意的是:多数浏览器支持最多可以4096字节的cookie,那么要将为数不多的几个值保存在用户计算机上,浏览器还限制了每个站点可以在用户计算机上保存的cookie数据。因为用户还可以设置自己的浏览器,拒绝接受cookie,这种情况下,只能够使用别的方式了。
传送页:
protected void Button6_Click(object sender, EventArgs e)
{
HttpCookie cookie = new HttpCookie("UserName");
cookie.Value = "小娟娟";
Response.AppendCookie(cookie);
Server.Transfer("get.aspx");
}
接收页:
//cookie传值
Label1.Text = Request.Cookies["UserName"].Value.ToString();
优点:数据传递方式方便,存储在客户端,不占用服务器资源。
缺点:安全性不高,我们开发人员不应该过多的依赖于cookie,而应该用结合的方式完成对敏感数据的存储。(2)多数浏览器对于cookie会有个数限制,而且并非所有浏览器都支持cookie,用户可以禁止和删除cookie,这种情况下使用就要十分小心了。
综上所述:cookie还是少用吧。
session作用于用户个人,所有过多的存储会导致服务器的内存资源耗尽。这一段时间关于登陆和权限判断,用的最多的就是session,了解也比较多 ,除了传值,也写一下使用Session需要注意的东西。
创建Session:
//创建Session
HttpContext.Current.Session["teacherID"] = currentUser.UserID;
HttpContext.Current.Session["operater"] = currentUser.UserName;</span>
接收session:
#region 从登陆session 获取用户名和角色
if (Session["userinfo"] == null || Session["userinfo"].ToString() == "")
{
Maticsoft.Common.MessageBox.ShowAndRedirect(this, "请登录后查看!", "/Mobile/Login.aspx");
return;
}
//获取操作员和IP
lblTeacherName.Text = Session["operater"].ToString();
//获取操作员和IP
lblTeacherID.Text = Session["teacherID"].ToString();
#endregion
Session 使用的时候,一定要判断一下是否为空,增强代码的严谨性。这两天进入测试阶段,注意到以前很多没有注意的问题,稍后会总结。
优点:
这种方法将数据存储在服务器中,可以传递一个对象,传递数据比较多,安全性比较高。session 可以在应用程序的多个页面中以名称/值对的方式共享,直到浏览器用户关闭自己的浏览器或者Session超时。(Session的时间可以自己设置,不设置,默认是20分钟),所以常用于登录身份验证中。例如:可以传递一个UserInfo,在别的页面,可以任意取Use的各种属性值。
缺点:
过多的Session会消耗服务器的服务器资源,所以使用要慎重。
五、使用Server.Transfer方法
网上资料说这个才是面向对象所使用的方法,使用Server.Transfer方法把流程从当前一个页面引导到另外一个页面,新的页面使用前一个页面的应答刘,所以这个方法是完全面向对象的。
使用这个方法我们可以在另一个页面以公开对象属性的方式来取值,首先定义一个public权限的属性,该属性返回所需要传递的值。然后context..Handler属性来获得前一个页面实例对象的引用,也就是可以通过访问自定义的属性来获取需要的值。
传送页:
protected void Button7_Click(object sender, EventArgs e)
{
Server.Transfer("get.aspx");
}
public string name
{
get { return "我是小娟娟"; }
}
接收页:
//server.Transer传值
a newweb;
newweb = (source)Context.Handler;
Label1.Text = newweb.name;
这里面有一个问题,newweb=(source)Context.Handler中,这个source报错,应该是少了什么引用,没有成功的运行出来,我还需要再查询一下。
六、站在巨人们的肩膀上
感谢 伟旗的专栏 Asp.net页面传值的优缺点 页面传值适用范围 优秀文章的分享。
小结:
故事还没有完结,回想一下get/post/MVC中如何使用,还需要再复习一下。