关于任何一个初学者来讲,页面之间传值可谓是必经之路,却又是他们的难点。实在,对大部份高手来讲,未必不是难点。
追念2016年口试的快要300人中,有实习生,有应届毕业生,有1-3年履历的,有3-5年履历的,有5-10年履历的,关于一切的口试者,我险些问了统一道题:"请说说你所晓得的页面之间传值的几种情势和要领,并叙述他们的道理和历程",关于这道题,从人人的回覆来看,结果并非很抱负,从品种上来讲,大部份人回覆5种摆布,少少部份能回覆8种,没有凌驾8种的,但从深度上来讲,很少有人能透辟的剖析每种要领的道理和历程,(固然,要想透辟的剖析这些道理和历程,须要研讨底层的东西,如page 生命周期和page道理,反射,IIS怎样剖析要求等,CLR,GC,反编译等)。
大抵归纳综合一下,ASP.NET 页面之间通报值得体式格局大抵能够分为以下几种:Request.QueryString["name"],Request.Form("name"),Session,Cookie,Cache,Application,Server.Transfer,Database,HttpContext的Item属性,Files,DataBase等等。
详解每种要领
一、Request.QueryString
中心代码:
protected void getQueryString_Click(object sender, EventArgs e) { string QueStr = Request.QueryString["name"]; Response.Write(QueStr); }
总结:
1、Request.QueryString:猎取http查询字符串变量鸠合。有两重载,即Request.QueryString[string name]和Request.QueryString[int index];
2、Request.QueryString主假如猎取url中的“?”以后的参数,如url:a.aspx?name="queryString",则Request.QueryString["name"]的值为“queryString”。
二、Request.Form
中心代码:
protected void getQueryString_Click(object sender, EventArgs e) { string strQueForm = Request.Form["TextBox1"]; Response.Write(strQueForm); }
总结:
1、Request.Form 猎取窗体变量鸠合。有两重载,即Request.Form[string name]和Requst.Form[int index]。
2、猎取表单指定名字的参数值。
三、Session
1、Session基础操纵
a、建立Session
//建立Session public void createSession(string[] arrStr) { //建立数组 string[] str=new string[arrStr.Length]; for (int i = 0; i < arrStr.Length; i++) { str[i] = i.ToString(); Session[str[i]] = arrStr[i]; } }
b、猎取Session的值
string getSessionValue=Session["name"].ToString();
c、遍历Session
//遍历Session public void getSession() { IEnumerator sessionEnum = Session.Keys.GetEnumerator(); while (sessionEnum.MoveNext()) { Response.Write(Session[sessionEnum.Current.ToString()].ToString()+";"); } }
d、清空Session,但不完毕会话
//清空Session,但不完毕会话 public void clearSession() { Session.Clear(); }
e、完毕Session会话
//完毕Session会话 public void abandonSession() { Session.Abandon(); }
2、Session数据寄存情势和位置
<system.web> <sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" timeout="number of minutes" stateConnectionString="tcpip=server:port" sqlConnectionString="sql connection string" stateNetworkTimeout="number of seconds"/> </system.web>
注解:
mode:示意设置存储Session情势和位置;
a、Off:禁用Session;
b、Inproc:In Process缩写,示意将Session存储在IIS历程内,但注重,该种体式格局虽然机能高,但IIS重启是,丧失Session信息;(默许值)
c、SateServer:将Session存储在ASP.NET状况效劳历程中(从新启动Web应用顺序时保留会话状况,并使会话状况能够用于网络中的多个Web效劳器);
d、将Session存储在SQL Server中
cookieless:设置客户端存储Session情势和位置
a、true:运用cookieless形式,这时候客户端的Session信息就不再运用Cookie存储了,而是将其经由过程URL存储;
b、false:运用kookie形式,默许值。
timeout 设置经由若干分钟后效劳器自动摒弃Session信息。默以为20分钟;
stateConnectionString 设置将Session信息存储在状况效劳中时运用的效劳器称号和端口号,比方:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。(默许端口42424);
sqlConnectionString 设置与SQL Server衔接时的衔接字符串。比方"data source=localhost;Integrated Security=SSPI;Initial Catalog=joye"。当mode的值是SQLServer时,这个属性是必需的;
stateNetworkTimeout 设置当运用StateServer形式存储Session状况时,经由若干秒余暇后,断开Web效劳器与存储状况信息的效劳器的TCP/IP衔接的。默许值是10秒钟;
3、Session道理
为何引入Session?人人晓得,因为http是一种无状况协定,因而,Session正弥补了这一瑕玷。固然,Session作用远远不止于这些,这里就不多叙述。
Session在ASP.NET中,示意客户端(Goggle,Firefox,IE等)与效劳器端的会话,用来存储特定会话信息,正确来讲,是用来存储特定用户信息。当客户端向效劳器发送一个要求时,如上岸用户ID,效劳器接收到该要求,效劳器端Session发生一个与该上岸用户相干的SessionID,并将SessioID返回给客户端(Goggle,Firefox,IE等),在新会话最先时,效劳器将SessionID当作cookie存储在用户的浏览器中。
总结:
1、定义:System.Web.SessionState.HttpSessionState Page.Session //猎取ASP.NET供应的当前Session对象。
2、特征:
a、Session中文意义为“会话”,在ASP.NET中,示意客户端和效劳器之间的会话,web中经常使用会话之一。
b、Session存储在效劳器端内存中。
c、Session能够存储任何范例的数据,包括自定义对象。
d、Session与Session间是互相自力的,互不滋扰。
e、Session与Cookie配对运用,Session在效劳器端发生SessionID,并将该SessionID返回给客户端(IE,FireFox,Google等),客户端Cookie来存储该SessionID,整过会话历程当中,只需保留SessionID的Cookie不丧失,则Session的信息就不会丧失。
f、Session保留的数据能够跨页接见,即跨页面是全局的。
g、Session不能跨历程接见,只能由该会话用户接见。
h、能够在不完毕会话的条件下,消灭Session信息,即挪用Session.Clear();
i、当会话完毕,逾期,效劳器就会消灭Session对象。
j、Session经常使用于保留登录用户的ID.
四、Application
中心代码:
(1)a.aspx
private void Button1_Click(object sender, System.EventArgs e) { Application["name"] = Label1.Text; }
(2)b.aspx
private void Page_Load(object sender, EventArgs e) { string name; Application.Lock(); name = Application["name"].ToString(); Application.UnLock(); }
总结:
1、Application对象的作用局限是全部全局,也就是说对一切用户都有用。它在全部应用顺序生命周期中都是有用的,相似于运用全局变量一样,所以能够在差别页面中对它举行存取。它和Session变量的区分在于,前者是一切的用户共用的全局变量,后者是各个用户独占的全局变量。能够有人会问,既然一切用户都能够运用application变量,那他能够用在什么场所呢?这里举个例子:网站接见数。多个要求接见时都能够对它举行操纵。
2、长处:运用简朴,斲丧较少的效劳器资本;不仅能通报简朴数据,还能通报对象;数据量大小是不限定的。
3、瑕玷:作为全局变量轻易被误操纵。所以单个用户运用的变量平常不能用application。
4、在源页面的代码中建立你须要通报的称号和值组织Application变量:Application["name"]="Value(Or Object)";在目标页面的代码运用Application变量掏出通报的值。Result = Application["name"]。
5、经常使用lock和unlock要领用来锁定和解锁,为了防备并发修正。
五、Cache
中心代码:
//Class1 Cache["id"] = TextBox1.Text; Response.Redirect("~/WebForm1.aspx"); //Class2 if (Cache["id"]!=null) { Label1.Text = Cache["id"].ToString(); } //移除缓存 Cache.Remove("id"); //假如 Cache["id"]为空,则传值失利。可运用以下要领实 //限日为10分钟 Cache.Insert("id",TextBox1.Text,null,Cache.NoAbsoluteExpiration,new TimeSpan(0,10,0));
总结:
1、应用顺序中的缓存机制用于将须要大批效劳器资本来建立的对象存储在内存中,以此大大革新应用顺序的机能。这个机制一样能够用来传值。
2、与其他要领差别的是,该要领须要设置缓存项优先级和缓存时候。因为当体系内存缺少时,缓存机制会自动移除很少运用或优先级较低的项,从而形成传值失利。
3、该要领的长处是通报数据的大小和数目无限定,速度快。瑕玷是缓存机制的操纵相对比较复杂。
六、Cookie
中心代码:
//Class1 HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie"); Response.Redirect("~/Class2.aspx"); //Class2 Label1.Text = Request.Cookies["testCookie"].Value;
总结:
1、Cookie用于在用户浏览器上存储小块的信息,保留用户的相干信息,比方用户接见某网站时用户的ID,用户的偏好等,用户下次接见就能够经由过程检索取得之前的信息。所以Cookie也能够在页面间通报值。
2、Cookie经由过程HTTP头在浏览器和效劳器之间往返通报的。Cookie只能包括字符串的值,假如想在Cookie存储整数值,那末须要先转换为字符串的情势。
3、与Session一样,其是什对每一个用户而言的,然则有个实质的区分,即Cookie是寄存在客户端的,而session是寄存在效劳器端的。而且Cookie的运用要合营ASP.NET内置对象Request来运用。
4、运用简朴,是坚持用户状况的一种异常经常使用的要领。比方在购物网站中用户跨多个页面表单时能够用它来坚持用户状况。
5、经常被人以为用来网络用户隐私而遭到指摘。
6、安全性不高,轻易捏造。
七、Context.Items["id"]
中心代码:
//Class1 Context.Items["id"]=TextBox1.Text; Server.Transfer("~/Class2.aspx"); //Class2 Label1.Text=Context.Items["id"].ToString(); Context.Items.Remove("id"); //移除项
1、Context 对象包括与当前页面相干的信息,供应对全部上下文的接见,包括要求、相应、以及上文中的Session 和Application 等信息。
2、能够运用此对象在网页之间同享信息,从而完成页面间的传值。
3、与运用 Form 的要领相似,该要领也能坚持大批的数据,瑕玷也雷同,但运用要领相对比较简朴。
八、ViewState
中心代码:
//Class1 ViewState["id"]=TextBox1.Text; //数据保留 Label1.Text=ViewState["id"].ToString(); //数据掏出 ViewState.Remove("id"); //数据移除
总结:
1、ViewState 是ASP.NET 用来在统一页面的多个要求之间保留和复原效劳器控件视图状况的一种机制。与传统的“统一页面”差别,ASP.NET 中“统一页面”的每一个要求都邑致使效劳器从新生成该页面,然则新生成的页面并不包括本来页面的数据。(页面无状况性)
2、ViewState 的使命就是保留本来页面中效劳器控件视图状况的数据供新页面运用。从这个意义上讲,ViewState 也能够看做是一种在页面间通报数据的东西。
3、ViewState 的事情道理是:作为一个隐蔽的窗体字段在客户端和效劳器之间通报,可见,滥用ViewState 会加重页面回传的累赘,从而下降应用顺序的机能。
别的,ViewState 也能被控件、页面和应用顺序禁用。
九、web.config和machine.config
中心代码:
//Class1 using System.Web.Configuration; WebConfigurationManager.AppSettings.Set("userName",TextBox1.Text); Response.Redirect("~/Class2.aspx"); //Class2 using System.Web.Configuration; Label1.Text = WebConfigurationManager.AppSettings["userName"];
总结:
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。(关于ASP.NET web.config文件细致引见,可参考我别的一篇博客:ASP.NET web.config)
4、machine.config:从c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目次中的一个叫macine.config的文件最先 设置。machine.config文件定义支撑的设置文件节,设置ASP.NET事情者历程,注册可用于高等特征(如设置文件、成员资历以及基于角色的安全等)供应顺序。(关于ASP.NET machine.config文件的细致引见,我以后会写一篇文章来引见)
十、Static
中心代码:
//class1 public static string userName;//在class1中定义静态全局变量 userName=txtBoxUserName.Text; Response.Redirect("~/class2.aspx"); //class2 Label1.Text=Src.id;
总结:
1、这个应当是异常轻易明白的,在ASP.NET中,每一个页面对应一个详细的类,既然如此,那末页面之间的通报,我们就能够归结为:类与类之间数据的通报。想到这一步,题目应当就水到渠成了, 因为我们能够应用类之间的公关静态变量来处理这个题目。
2、若合理应用,能够有用地进步数据通报效力,但若滥用,能够会致使用户或页面间数据杂乱,存在肯定风险和隐患,应郑重运用。
提出以下题目:人人能够剖析一下,以下代码有什么题目?
//Class1 protected void btnRedirect_Click(object sender, EventArgs e) { string userName = txtBoxUserName.Text; Response.Redirect("~/Class2.aspx"); } //Class2 Lable1.Text=userName;
十一、补充经常使用页面之间跳转
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);
解释:比较简朴,我这里就不叙述了。
总结:
关于页面之间传值,另有许多要领,如文件传值、数据库传值,ViewBag等等,在这里就不逐一叙述了。若以后有时候,将会在此基础上补充,并逐步完善该篇博文。
以上就是本文的全部内容,愿望对人人的进修有所协助,也愿望人人多多支撑ki4网。
更多详解ASP.NET 页面之间传值的几种体式格局相干文章请关注ki4网!