ASP.NET页面之间传递值的几种方法

ASP.NET页面之间传递值的几种方法...
一.使用QueryString
Request.QueryString
在ASP时代,这个是较常用的方法,到了ASP.NET,仿佛用的己未几了,但是不论怎样道,这是一个出有过期,且很值得推举的方法,由于不论是ASP还是ASP.NET,最基础的皆仍是基于HTTp协定的。 缺点长短常显明的,让在多个页面传递时,能够就Request不到了
使用QueryString在页面间传递值是一种非经常睹的方法,人们在ASP中便经常用到。
(1)长处和毛病
优点:
1.使用简双,关于平安性请求没有高时传递数字或者是白原值十分有效。
缺点:
1.缺少平安性,因为它的值表露在涉猎器的URL地址中的。
2.不能传递对象。
(2)使用法子
1.在源页面的代码顶用需要传递的实称和值构制URL地址。
2.在源页面的代码用Response.Redirect(URL);沉定背到上面的URL天址中。
3.在目的页面的代码使用Request.QueryString["name"];取出URL地址中传递的值。
(3)运用举例
1.源页面*.aspx的代码:
private void Button1_Click(object sender, System.EventArgs e)
{
string urlAddress;
string Name1;
string Name2;
string Name3;
string Name1Value = "HelloName1";
int Name2Value = 1234567;
string Name3Value = "你佳实称3";
urlAddress = "destinationWebForm.aspx?Name1=" + Name1Value + "&" + "Name2=" + Name2Value.ToString() + "&" + "Name3=" + Name3Value;
Response.Redirect(urlAddress);
}
2.目的页面destinationWebForm.aspx的代码:
private void Page_Load(object sender, System.EventArgs e)
{
string myName1Value;
int myName2Value;
string myName3Value;
myName1Value = Request.QueryString["Name1"];
myName2Value = Convert.ToInt32(Request.QueryString["Name2"]);
myName3Value = Request.QueryString["Name3"];
}
(4)能够呈现的答题
1在处置Resonse.QueryString函数汉字参数传送时,产生没有能完全传递参数的详细值的过错,解决有两个办法。
方法一:需求沉新设放Web.config中的encoding和齐球化设放。
1、首行:<?xml version="1.0" encoding="utf-8" ?>
更改为:
<?xml version="1.0" encoding="GB2312" ?>
2、<!-- 全球化
彼节设放运用程序的齐球化设置。
-->
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>
更改为:
<!-- 全球化
彼节设置使用程序的全球化设置。
-->
<globalization
requestEncoding="GB2312"
responseEncoding="GB2312"
/>
[1]
法子两:使用Server.UrlEncode和Server.UrlDecode对于汉字或许特别字符入止编码和解码。
二、使用Application变量
这个在ASP时期仍是比拟常用的,重要用来存储齐局变量,例如数据库链交疑作,到了ASP.NET时期,用的未几,至少人佳象不断出有用过。
使用Application变量是在页面间传递值的第两种方式。
Application变量在整个当用程序性命周期中都是有效的,相似于使用全局变量一样,所以可以在不同页面中对它进行存取。它和Session变量的区别在于,前者是一切的用户同用的全局变量,后者是各个用户独占的全局变量。
举个例子来说明:
网站拜访的计数器变量普通采取Application变量,少个恳求造访时同享那一个变量,均可对它入止操做,当变量能够被整个利用程序的各个页面直交使用。
用户登陆的帐号名普通采取Session变量,多个要求拜访时有各自的Session变量,只能对本人的当Session变量入行操作,整个使用程序的各个页面直接使用这个变量来获得用户的基础信息。
(1)优面和缺陷
长处:
1.使用简略,耗费较少的效劳器资流。
2.不只能传递简略数据,还能传递对象。
3.数据量大小是不限造的。
缺陷:
1.做为全局变量轻易被误操做。
(2)使用方法
1.在源页面的代码中创立您需求传递的称号和值结构Application变量:Application["Nmae"]="Value(Or Object)";
2.在纲的页面的代码使用Application变量掏出传递的值。Result = Application["Nmae"]
(3)运用举例
1.源页面 *.aspx的代码:
private void Button1_Click(object sender, System.EventArgs e)
{
string Name1Value = "HelloName1";
int Name2Value = 1234567;
Application["Name1"] = Name1Value;
Application["Name2"] = Name2Value;
}
2.目的页面 *.aspx的代码:
private void Page_Load(object sender, System.EventArgs e)
{
string myName1Value;
int myName2Value;
myName1Value = Application["Name1"].ToString();
myName2Value = (int)Application["Name2"];
}

三、使用Session变量
这个是最常用的一个方法,Session的优点是使用简双,缺点是占用服务器资源,由于每一个Session皆意味这服务器需要保护相当客户的会话信息,天然假如登录的用户多了,那么将十分占用服务器资源。另外Session还有一个缺点,默许的假如你登录后20分钟内出有任何动作,服务器主动会撤消当会话,所以那时你又需要登录。
PS。这里使得我念止一个事情,前几天有一个公司让我望了一段代码,在登录时,就是使用Session记载用户登录的,My GOD,微软晓得了确定要吐血!!它辛辛劳甘给你降求的web.config里的配置 <deny user="*"/> 就要这一个配置,您不必,仍旧用ASP时期的Session,岂不是挥霍了MS的一片甘口
使用Application变量是在页面间传递值的第三种方法。Session变量和Application变量十分相似,它们的区别也已经在上面闭于Application变量时降到了。
(1)优点和缺点
长处:
1.使用简略,不只能传递简双数据类型,还能传递对象。
2.数据量大小是不限造的。
缺点:
1.正在Session变质存储大批的数据会耗费较少的效劳器资流。

(2)使用方式
1.在源页面的代码中创修你需求传递的称号和值结构Session变量:Session["Nmae"]="Value(Or Object)";
2.在纲的页面的代码使用Session变质掏出传递的值。Result = Session["Nmae"]
(3)使用举例
取Application变量相似,只是将Application替代为Session便可。
四、使用Cookie对象
这个是我的最爱,Cookie最大的特色是由客户端保护,不必占用服务器资源,而且你可以设定用户登录时,Cookie的有效期,例如一天,这样在一天内你不必担忧体系再让你登录。该然Cookie也出缺点,那就是安全性,由于Cookie在客户端,确切有些软件可以剖析Cookie的登录信息,所以你写进Cookie的内容不要过于迟钝,例如不要存储稀码,还有作为平安,写入Cookie的内容最好要加稀,拉丁舞服装
使用Cookie对象是在页面间传递值的第四种方法。Cookie用于在用户涉猎器上存储小块的疑息,保留用户的相干疑作,好比用户拜访某网站时用户的ID,用户的偏偏佳等,用户下次造访便可以通过检索获得以前的信作。所以Cookie也可以在页面间传递值。Cookie通过HTTP头在阅读器和服务器之间往返传递的。Cookie只能包括字符串的值,假如念在Cookie存储整数值,那么须要先转换为字符串的情势。
能够通过遍历Request对于象的Cookie聚集可以取得一切的阅读器一切的Cookie。办法如下:
foreach (string strKey in Request.Cookies)
{
lblCookies.Text += strKey + "=" + Request.Cookies[ strKey ].Value;
}

(1)优点和缺点
优面:
1.使用简单,是坚持用户状况的一种非经常用的方法。好比在买物网站顶用户跨多个页面表单时可以用它来维持用户形态。
毛病:
1.经常被己以为用来搜集用户隐公而遭到批驳。

(2)使用方式
1.在流页面的代码中创立您须要传递的称号和值结构Cookie对象:
HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
Response.Cookies.Add(cookie);
2.正在目标页里的代码使用Cookie对于象掏出传送的值:Result = Request.Cookies[ "myCookie" ].Value;
(3)利用举例
1.源页面 *.aspx的代码:
private void Button1_Click(object sender, System.EventArgs e)
{
HttpCookie objCookie = new HttpCookie("myCookie","Hello,Cookie!");
Response.Cookies.Add(objCookie);
}
2.目标页面 *.aspx的代码:
private void Page_Load(object sender, System.EventArgs e)
{
string myName1Value;
myName1Value = Request.Cookies[ "myCookie" ].Value;
}
五、使用Server.Transfer

使用Server.Transfer变质是在页里间传送值的第五类方法。上面的四个办法人们在ASP中经常使用,但是那个方式是在ASP.NET中新呈现的。Server.Transfer是自以后的ASPX页面转到新的ASPX页面,服务器端施行新页并输出,正在新页面中通功Context.Handler来取得前一个页面传递的各种数据类型的值、表双数据、QueryString.因为沉订背完整在效劳器端完成,所以客户端阅读器中的URL天址是没有会转变的。
调用Server.Transfer时,以后的ASPX页面末止施行,执止淌程转进另一个ASPX页面,但新的ASPX页面仍使用前一ASPX页面创修的应对淌。[2]
在这里比拟一下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中带参数或者是联合上面四类措施把各品种型的值传到新的页里。

继承我们的Server.Transfer用法。
(1)优面和缺陷
优点:
1.直接在服务器端重定向,使用简单便利,减少了客户端对服务器端提出请求。
2.可以传递各种数据类型的值和控件的值。
毛病:
1.客户端浏览器中的URL地址是不转变,会招致在新的页面能够呈现一些意念不到的答题。好比假如源页面和目的页面不在统一个虚拟目录或其子目录下,BB霜,那么使用绝对道径的图片、超链接皆会招致过错的指向。[3]

(2)使用方法
1.在源页面的代码中,使用Page类的Server.Transfer跳到另一个页面传递页面数据:
Server.Transfer("destinationWebForm.aspx","false")。
2.在目标页面中,使用Context.Handler来接受数据:
FormerPage formerPage = (FormerPage)Context.Handler;
然后用formerPage的属性和方法来获取前一个页面的值,或许直接用
Context.Items["myParameter "]
来获取前一个页面的值。
需要注意的是获取这些值必需在新的页面初次加载时,能力准确获取上一页面的各种数据类型或是控件的值。在以后的postback时,就无法获取上一页面的各种数据类型或者是控件的值了,由于彼时失掉的以后页面的真例. 所以需要在新页面(destinationWebForm.aspx)的Page_Load()事情中使用if(!IsPostBack)把获取前一个页面的值的代码包括止来,能力获得前一个页面传递的各种数据类型的值、表双数据、QueryString。
(3)利用举例
1.源页面 FormerPage.aspx的代码:
public string HelloContextAttribute
{
get
{
return "Use Attribute: Hello,Context";
}
}
public string HelloContextMethod()
{
return "Call Method: Hello,Context!";
}
public string TextBoxValue
{
get
{
return TextBox1.Text;
}
}

private void Button1_Click(object sender, System.EventArgs e)
{
string Name1Value = "Hello, Name1!";
TextBox1.Text ="Hello,TextBox1!";
ArrayList myList = new ArrayList(3);//创立动态数组
myList.Add("Hello,Array1! ");//背动态数组中加加新的值
myList.Add("Hello,Array2!");
myList.Add("Hello,Array3!");
//Context可保留恣意数据类型,Context字典特订于某个Http恳求。
//关于不同客户端,值是不一样的。
Context.Items["destinationList"] = myList;//在Context.Items中保留动态数组
Context.Items.Add("newContext","Hello,NewContext");//在Context.Items中保管一组实称-值的数据
//Server.Transfer第两参数假如为true,表现原页面的Form和QuerryString的值在新页面继承有效。
//否则在新页面无法取得TextBox1的值。
Server.Transfer("destinationWebForm.aspx?Name1="+ Name1Value,true);
}

2.纲的页面 destinationWebForm.aspx的代码:

private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
try
{
string helloContextAttribute;
string helloContextMethod;
string textBoxValue;
string contextItemsValue;
string queryString;
ArrayList listResult;
FormerPage formerPage = (FormerPage)Context.Handler;
helloContextAttribute = formerPage.HelloContextAttribute;//通功FormerPage中订义的属性来获与值
helloContextMethod = formerPage.HelloContextMethod();//通过FormerPage中定义的方法来获取值
textBoxValue = formerPage.TextBoxValue;//通过FormerPage中前往白原控件的值
//下面的方法少用于用户在控件中输进值后能力获取,但是在程序中给直交TextBox1.Text赋值,那么下面的方法获得
//的空值,在那类情形下须要使用上面的获与法子
//textBoxValue = Request.Form["TextBox1"];

contextItemsValue = Context.Items["newContext"].ToString();//通过FormerPage中Context的Items获取值
listResult = (ArrayList)Context.Items["destinationList"];//通过FormerPage中Context的Items获取对象,强迫转换类型:
queryString = Request.QueryString["Name1"];//通功FormerPage的URL中的QueryString获与值
}
catch
{
Response.Write("Error!");
}
}
}
六:Viewstate
ASP.NET新增的,Viewstate使用简双,缺点是只可以在统一个页面使用,在ASP.NET2.0里这个答题可以使用Button的PostBackUrl进行成果。
七:Cache
使用Cache存储数据还想未几,但是究竟也是一种手腕,另外,在使用Cache存储DataSet时,实在仍是援用而不是内容的拷贝。
相关的主题文章: 文章来源:www.zgh.gov.cnhttp://www.shiyuemami.org

 

posted @ 2010-09-17 07:28  英雄不问出处  阅读(674)  评论(0编辑  收藏  举报