开篇概述
对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点。其实,对大部分高手来说,未必不是难点。
回想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) { ]; 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) { ]; Response.Write(strQueForm); }
总结:
1、Request.Form 获取窗体变量集合。有两重载,即Request.Form[string name]和Requst.Form[int index]。
2、获取表单指定名字的参数值。
三、Session
1、Session基本操作
a、创建Session
createSession(string[] arrStr) { [] str=new string[arrStr.Length]; for (int i = 0; i < arrStr.Length; i++) { str[i] = i.ToString(); Session[str[i]] = arrStr[i]; } }
b、获取Session的值
].ToString();
c、遍历Session
getSession() { IEnumerator sessionEnum = Session.Keys.GetEnumerator(); while (sessionEnum.MoveNext()) { Response.Write(Session[sessionEnum.Current.ToString()].ToString()+); } }
d、清空Session,但不结束会话
clearSession() { Session.Clear(); }
e、结束Session会话
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[] = Label1.Text; }
(2)b.aspx