`
zwein
  • 浏览: 13179 次
  • 性别: Icon_minigender_1
  • 来自: 福州
文章分类
社区版块
存档分类
最新评论

在两个ASP.NET页面之间传递变量 (QueryString,Session和Cookies Application)

 
阅读更多
ASP.NET提供了事件驱动编程模型,使开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,在传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递变量,同样的事情,在使用事件驱动编程模型的ASP.NET就要麻烦一些,但是我们仍然有一些方法可以实现同样的功能。笔者在这里将包含使用querystring,session变量以及server.Transfer方法来实现页面间的变量传递。

使用QueryString
使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在很多传递的值少而安全性要求不高的情况下,这个方法还是较多地被首选使用。

使用这种方法包括如下的步骤:
a,使用控件创建web表单(form)
b,创建可以返回表单的按钮和链接按钮
c,在按钮或链接按钮的单击事件里创建一个保存URL的字符变量
d,在保存的URL里添加QueryString参数
e,使用Response.Redirect重定向到上面保存的URL
下面的代码片断演示了如何实现这个方法:
源页面代码:
private void Button1_Click
(object sender, System.EventArgs e)
{
string url;
url="webform1.aspx?var1=" + TextBox1.Text + "&var2=" + TextBox2.Text;
Response.Redirect(url);
}
目标页面代码:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Request.QueryString["var1"];

// Label1.Text=Request.QueryString["var1"] 也可以直写为 Label1.Text=Request["var1"]下面的语句也是一样可以简写
Label2.Text=Request.QueryString["var2"];
}
使用Session变量
使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下:
a,在页面里添加必要的控件
b,创建可以返回表单的按钮和链接按钮
c,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里
d,使用Response.Redirect方法重定向到另一个页面
e,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它

移除个别:Session.Remove("aa");

全部清除:Session.Clear(); (一般应用于注销)

在开始使用前,首先看一下如何的使用SESSION,和ASP中相差不多
写入SESSION变量:

C#:
Session["username"])="aa";

VB:

Session("username")="aa"
读取SESSINN变量:

C#
string username= Session["username"];
VB:

dim username=Session("username")

下面的是一段使用session的程序代码 :
源页面代码:
private void Button1_Click
(object sender, System.EventArgs e)
{
Session["var1"]=TextBox1.Text;
Session["var2"]=TextBox2.Text;
Server.Transfer("webform1.aspx");
}
目标页面代码:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Session["var1"].ToString();
Label2.Text=Session["var2"].ToString();
Session.Remove("var1");
Session.Remove("var2");
}

使用Server.Transfer
这个方法相比上面介绍的方法稍微复杂一点,但在页面间变量传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:
a,在页面里添加必要的控件
b,创建返回值的Get属性过程
c,创建可以返回表单的按钮和链接按钮
d,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面
e,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了
以下代码综合实现上述步骤过程的代码:
源页面代码:
把以下的代码添加到页面中
public string Var1
{
get
{
return TextBox1.Text;
}
}

public string Var2
{
get
{
return TextBox2.Text;
}
}
然后调用Server.Transfer方法
private void Button1_Click
(object sender, System.EventArgs e)
{
Server.Transfer("webform1.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.Var1;
Label2.Text=wf1.Var2;
}

后记:

笔者在上面使用不同的方法实现了ASP.NET页面间变量传递,这三种方法是:QueryString,Session和Server.Transfer,或许你还可以找到其他的办法来实现ASP.NET页面间变量传递,实际上你稍想点办法也可以将变量传递给页面自己(页面刷新特别是换页显示时传递新的页号等时比较常用)。

这里特别提下ruquest. QueryString 中的request对象实际上操作system.web 命名空间中的类httprequest。当客户发出请求执行asp.net时,CLR会将客户端请求信息包装在Request对象中。这些请求信息包括请求报头、客户端基本信息(浏览器信息、浏览器版本号、用户所用的语言、编码方式等)、请求方法(post、get)、参数名、参数值等。Request对象的调用方法为:

Request.collection[“variable”]

其中collection包括QueryStrin、Form、Cookies、ServerVariables四种集合,我们上面曾提到可以将Request.QueryString["var1"]写为Request["var1"]看起来比较简洁,但这样作其实不是一种好的方法,因为省掉collection选项后,Request会按照QueryString、Form、Cookies、ServerVariables的顺序进行搜索直到发现“variable”所指的关键字并返回其值,没有找到则返回(null)。因此为了提供程序的执行效率,最好还是指定collection,过多地搜索会影响程序执行的效率。置于Cookies、ServerVariables等我将在以后的文章详细说明。

二. 页面间参数传递问题集合 QueryString Session Cookies Application


ASP.NET提供了事件驱动编程模型,使开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,在传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递变量,同样的事情,在使用事件驱动编程模型的ASP.NET就要麻烦一些,但是我们仍然有一些方法可以实现同样的功能。笔者在这里将包含使用querystring,session变量以及server.Transfer方法来实现页面间的变量传递。

使用QueryString
使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址栏上的(不安全),同时又不能传递对象,但是在很多传递的值少而安全性要求不高的情况下,这个方法还是较多地被首选使用。

使用这种方法包括如下的步骤:
a,使用控件创建web表单(form)
b,创建可以返回表单的按钮和链接按钮
c,在按钮或链接按钮的单击事件里创建一个保存URL的字符变量
d,在保存的URL里添加QueryString参数
e,使用Response.Redirect重定向到上面保存的URL
下面的代码片断演示了如何实现这个方法:
源页面代码:
private void Button1_Click
(object sender, System.EventArgs e)
{
string url;
url="webform1.aspx?var1=" + TextBox1.Text + "&var2=" + TextBox2.Text;
Response.Redirect(url);
}
目标页面代码:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Request.QueryString["var1"];

// Label1.Text=Request.QueryString["var1"] 也可以直写为 Label1.Text=Request["var1"]下面的语句也是一样可以简写
Label2.Text=Request.QueryString["var2"];
}
使用Session变量
使用Session变量是可以在页面间传递值的的另一种方式,在本例中我们把控件中的值存在Session变量中,然后在另一个页面中使用它,以不同页面间实现值传递的目的。但是,需要注意的是在Session变量存储过多的数据会消耗比较多的服务器资源,在使用session时应该慎重,当然了,我们也应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗。使用Session变量传递值的一般步骤如下:
a,在页面里添加必要的控件
b,创建可以返回表单的按钮和链接按钮
c,在按钮或链接按钮的单击事件里,把控件的值添加到session变量里
d,使用Response.Redirect方法重定向到另一个页面
e,在另一个页面提取session的值,在确定不需要使用该session时,要显式清除它

在开始使用前,首先看一下如何的使用SESSION,和ASP中相差不多
写入SESSION变量:

C#:
Session["username"])="aa";

VB:

Session("username")="aa"
读取SESSINN变量:

C#
string username= Session["username"];
VB:

dim username=Session("username")

下面的是一段使用session的程序代码 :
源页面代码:
private void Button1_Click
(object sender, System.EventArgs e)
{
Session["var1"]=TextBox1.Text;
Session["var2"]=TextBox2.Text;
Server.Transfer("webform1.aspx");
}
目标页面代码:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Session["var1"].ToString();
Label2.Text=Session["var2"].ToString();
Session.Remove("var1");
Session.Remove("var2");
}

使用Server.Transfer
这个方法相比上面介绍的方法稍微复杂一点,但在页面间变量传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的。总体来说,使用这种方法是简洁的同时又是面向对象的。使用这种方法的整个过程如下:
a,在页面里添加必要的控件
b,创建返回值的Get属性过程
c,创建可以返回表单的按钮和链接按钮
d,在按钮单击事件处理程序中调用Server.Transfer方法转移到指定的页面
e,在第二个页面中,我们就可以使用Context.Handler属性来获得前一个页面实例对象的引用,通过它,就可以使用存取前一个页面的控件的值了
以下代码综合实现上述步骤过程的代码:
源页面代码:
把以下的代码添加到页面中
public string Var1
{
get
{
return TextBox1.Text;
}
}

public string Var2
{
get
{
return TextBox2.Text;
}
}
然后调用Server.Transfer方法
private void Button1_Click
(object sender, System.EventArgs e)
{
Server.Transfer("webform1.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.Var1;
Label2.Text=wf1.Var2;
}

后记:

笔者在上面使用不同的方法实现了ASP.NET页面间变量传递,这三种方法是:QueryString,Session和Server.Transfer,或许你还可以找到其他的办法来实现ASP.NET页面间变量传递,实际上你稍想点办法也可以将变量传递给页面自己(页面刷新特别是换页显示时传递新的页号等时比较常用)。

这里特别提下ruquest. QueryString 中的request对象实际上操作system.web 命名空间中的类httprequest。当客户发出请求执行asp.net时,CLR会将客户端请求信息包装在Request对象中。这些请求信息包括请求报头、客户端基本信息(浏览器信息、浏览器版本号、用户所用的语言、编码方式等)、请求方法(post、get)、参数名、参数值等。Request对象的调用方法为:

Request.collection[“variable”]

其中collection包括QueryStrin、Form、Cookies、ServerVariables四种集合,我们上面曾提到可以将Request.QueryString["var1"]写为Request["var1"]看起来比较简洁,但这样作其实不是一种好的方法,因为省掉collection选项后,Request会按照QueryString、Form、Cookies、ServerVariables的顺序进行搜索直到发现“variable”所指的关键字并返回其值,没有找到则返回(null)。因此为了提供程序的执行效率,最好还是指定collection,过多地搜索会影响程序执行的效率。置于Cookies、ServerVariables等我将在以后的文章详细说明。

·客户机
1.查询字苻串RequryString---利用URL在客户机和服务器间进行数据交换
2.隐藏的窗体字段---在窗体字段中设置和读取数据
3.COOKIE---保存在客户浏览器上的数据
4.视图状态ViewState---保存页面相关数据

·服务器
5.应用程序Application---这种数据在应用程序整个生命周期内可以被所有用户利用
6.会话Session---这种数据和每个用户联系
7.暂存状态Context---这种数据在单个请求过程中存在
8.缓存Cache---这种数据与应用程序相类似
9.其他物理数据存放媒体---例如数据库,TXT文本,XML文件等等
10. 使用Server.Transfer方法


1. 使用QueryString变量

QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面是一个例子:

a.aspx的C#代码

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

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
Label2.Text = Request.QueryString["name"];
}
注意:
如果参数为汉字,则会出现乱码或者最后一个汉字会不知所以的丢失。
解决方法如下:
方法1.在asp.net中可以用Server.UrlEncode(参数)将参数加密,然后在QueryString传递,在接受端跟平常一样将参数接受下来,然后用Server.UrlDecode(参数)将参数解密,就OK了。在javascript中可以用encodeurl和decodeurl来加解密。
方法2.在中文参数后面加上一个字符串,在接受端接受后将字符去掉,就OK了,虽然有点雕虫小技的感觉,却屡试不爽!

2.隐藏的窗体字段
利用隐藏的窗体字段在客户机和服务器间传递数据也是可行的

例如:
<input type="hidden" name="aa" value="abc">

string str=Request.Form["aa"];
str就等于“abc“

总结,最好不要放安全性高的数据,例如不要传递密码,银行卡号码等数据

3. 使用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();
}

4.视图状态ViewState---保存页面相关数据

在控件中启用ViewState属性即可.

5. 使用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();
}

6. 使用Session变量

想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。

a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
Session["name"] = Label.Text;
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
name = Session["name"].ToString();
}

7.暂存状态Context---这种数据在单个请求过程中存在

ASP.NET提供一个类System.Web.HttpContext ,用来表示上下文,此对象有一个属性Items
暂存状态就是利用HttpContext.Items属性来存放数据
MSDN中HttpContext.Items属性的解释是这样的:获取可用于在 HTTP 请求过程中在 IHttpModule 和 IHttpHandler 之间组织和共享数据的键值
HttpContext.Items属性中可以存放任何类型数据,无论这个属性中存放什么数据,都会在请求处理结束后自动清除,这就是暂存状态,数据的存放时间非常短.

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

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

10. 使用Server.Transfer方法

这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。

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

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


分享到:
评论

相关推荐

    列举ASP.NET页面之间传递值的几种方式

    为了在页面之间传递变量内容,ASP.NET给了我们几个选择。一种选择是使用QueryString 属性 一:QueryString. 可以使用查询字符串请求网页。ASP.NET中的QueryString访问此信息。当你加载file.html?x = y时,它解析“x...

    ASP.NET页面之间传值

    ASP.NET C#页面之间传值.QueryString,Application,Session,Cookie,Server.Transfer

    ASP.NET页面间数据传递的方法

    ASP.NET页面间数据传递的各种方法和分析 1.使用Querystring 方法 QueryString 也叫查询字符串, 这种方法将要传递的数据附加在网页地址(URL)后面进行传递。如页面A.aspx 跳转到页面B.aspx,可以用Request....

    ASP.NET C# 页面间数据传递

     一般稍微庞大的ASP.NET程序至少拥有二个或以上的Web页面,程序员在开发类似ASP.NET应用程序时一般都需要处理在多个Web页面传递数据的问题。我们知道ASP.NET程序中的各个Web页面类似于Windows应用程序中的Form窗体...

    在asp.net页面中传递中文参数

    asp.net页面参数传递:一、使用Querystring、二、使用Session变量、三、使用Server.Transfer 、在asp.net页面中传递中文参数 1.设置web.config文件。 &lt;system.web&gt; ...... ...

    ASP.NET C#页面传值汇总

    ASP.NET C#页面传值( Querystring / Session /Server.Transfer /Application /Cookie)实例化的讲解 直观易懂 一看就会

    asp.net下Request.QueryString取不到值的解决方法

    asp.net下Request.QueryString取不到值的解决方法

    ASP.NET面试题大全新

    《ASP.NET面试题大全》内容摘要:private、 protected、 public、 internal 修饰符的访问权限,ASP.NET 页面之间传递值的几种方式,C#中的委托是什么,件是不是一种委托,override与重载的区别,实现一个冒泡排序算法.......

    asp.net中页面之间的传值(三种方法)

    本文将包含使用querystring,session变量以及server.Transfer方法来实现页面间的值传递。 要谢谢 回答者:okfeng100 是他提供

    ASP.NET中页面之间传递值的几种方式整理

    但是一般来说,常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。一、QueryString QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多...

    asp.net页面通过URL参数传值中文乱码问题解决办法

    asp.net页面通过URL参数传值中文乱码问题解决办法

    asp.net 页面之间如何传值

    本文将包含使用querystring,session变量以及server.Transfer方法来实现页面间的值传递。

    基于ASP.NET实现的QueryString进行安全加密处理类库函数

    基于ASP.NET实现的QueryString进行安全加密处理类库函数,采用C#+ASP.NET开发。

    ASP.net页面传值

    对ASP.net页面传值知识的总结,本文将包含使用QueryString,Session变量以及 Server.Transfer三种方法来实现页面间的值传递。

    经典ASP.NET面试题

    列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34.........

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

    ASP.NET经典60道面试题

    1. 简述 private、 protected、 public、 internal 修饰符的访问...列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer

    ASP.NET跨页面传值技巧总结.mht

    使用QueryString变量 使用Application 对象变量 使用Session变量 使用Cookie对象变量 使用Server.Transfer方法

    asp.net(QUERYSTRING方式)最简单分页代码

    asp.net(QUERYSTRING方式)最简单分页代码

Global site tag (gtag.js) - Google Analytics