ASP.NET MVC系列文章javascript
【01】浅谈Google Chrome浏览器(理论篇)html
【02】浅谈Google Chrome浏览器(操做篇)(上)java
【03】浅谈Google Chrome浏览器(操做篇)(下)web
【04】浅谈ASP.NET框架 面试
【05】浅谈ASP.NET MVC运行过程 sql
【06】浅谈ASP.NET MVC 控制器 数据库
【07】浅谈ASP.NET MVC 路由 数组
【08】浅谈ASP.NET MVC 视图 浏览器
【09】浅谈ASP.NET MVC 视图与控制器传递数据缓存
【10】浅谈jqGrid 在ASP.NET MVC中增删改查
【13】浅谈NuGet在VS中的运用
【14】浅谈ASP.NET 程序发布过程
开篇概述
对于任何一个初学者来讲,页面之间传值可谓是必经之路,却又是他们的难点。其实,对大部分高手来讲,未必不是难点。
回想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等等。
详解每种方法
1、Request.QueryString
核心代码:
protected void getQueryString_Click(object sender, EventArgs e) { string QueStr = Request.QueryString["name"]; Response.Write(QueStr); }
总结:
一、Request.QueryString:获取http查询字符串变量集合。有两重载,即Request.QueryString[string name]和Request.QueryString[int index];
二、Request.QueryString主要是获取url中的“?”以后的参数,如url:a.aspx?name="queryString",则Request.QueryString["name"]的值为“queryString”。
2、Request.Form
核心代码:
protected void getQueryString_Click(object sender, EventArgs e) { string strQueForm = Request.Form["TextBox1"]; Response.Write(strQueForm); }
总结:
一、Request.Form 获取窗体变量集合。有两重载,即Request.Form[string name]和Requst.Form[int index]。
二、获取表单指定名字的参数值。
3、Session
一、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(); }
二、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秒钟;
三、Session原理
为何引入Session?你们知道,由于http是一种无状态协议,所以,Session正弥补了这一缺陷。固然,Session做用远远不止于这些,这里就很少论述。
Session在ASP.NET中,表示客户端(Goggle,Firefox,IE等)与服务器端的会话,用来存储特定会话信息,准确来讲,是用来存储特定用户信息。当客户端向服务器发送一个请求时,如登录用户ID,服务器接收到该请求,服务器端Session产生一个与该登录用户相关的SessionID,并将SessioID返回给客户端(Goggle,Firefox,IE等),在新会话开始时,服务器将SessionID当作cookie存储在用户的浏览器中。
总结:
一、定义:System.Web.SessionState.HttpSessionState Page.Session //获取ASP.NET提供的当前Session对象。
二、特性:
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.
4、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(); }
总结:
一、Application对象的做用范围是整个全局,也就是说对全部用户都有效。它在整个应用程序生命周期中都是有效的,相似于使用全局变量同样,因此能够在不一样页面中
对它进行存取。它和Session变量的区别在于,前者是全部的用户共用的全局变量,后者是各个用户独有的全局变量。可能有人会问,既然全部用户均可以使用application
变量,那他能够用在什么场合呢?这里举个例子:网站访问数。多个请求访问时均可以对它进行操做。
二、优势:使用简单,消耗较少的服务器资源;不只能传递简单数据,还能传递对象;数据量大小是不限制的。
三、缺点:做为全局变量容易被误操做。因此单个用户使用的变量通常不能用application。
四、在源页面的代码中建立你须要传递的名称和值构造Application变量:Application["name"]="Value(Or Object)";在目的页面的代码使用Application变量取出传递的值。Result = Application["name"]。
五、经常使用lock和unlock方法用来锁定和解锁,为了防止并发修改。
5、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));
总结:
一、应用程序中的缓存机制用于将须要大量服务器资源来建立的对象存储在内存中,以此大大改进应用程序的性能。这个机制一样能够用来传值。
二、与其余方法不一样的是,该方法须要设置缓存项优先级和缓存时间。由于当系统内存缺少时,缓存机制会自动移除不多使用或优先级较低的项,从而形成传值失败。
三、该方法的优势是传递数据的大小和数量无限制,速度快。缺点是缓存机制的操做相对比较复杂。
6、Cookie
核心代码:
//Class1 HttpCookie httpCookie = new HttpCookie("testCookie","Page transfers by Cookie"); Response.Redirect("~/Class2.aspx"); //Class2 Label1.Text = Request.Cookies["testCookie"].Value;
总结:
一、Cookie用于在用户浏览器上存储小块的信息,保存用户的相关信息,好比用户访问某网站时用户的ID,用户的偏好等,用户下次访问就能够经过检索
得到之前的信息。因此Cookie也能够在页面间传递值。
二、Cookie经过HTTP头在浏览器和服务器之间来回传递的。Cookie只能包含字符串的值,若是想在Cookie存储整数值,那么须要先转换为字符串的形式。
三、与Session同样,其是什对每个用户而言的,可是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。并且Cookie的使
用要配合ASP.NET内置对象Request来使用。
四、使用简单,是保持用户状态的一种很是经常使用的方法。好比在购物网站中用户跨多个页面表单时能够用它来保持用户状态。
五、经常被人认为用来收集用户隐私而遭到批评。
六、安全性不高,容易伪造。
7、Context.Items["id"]
核心代码:
//Class1 Context.Items["id"]=TextBox1.Text; Server.Transfer("~/Class2.aspx");
//Class2 Label1.Text=Context.Items["id"].ToString(); Context.Items.Remove("id"); //移除项
一、Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求、响应、以及上文中的Session 和Application 等信息。
二、可使用此对象在网页之间共享信息,从而实现页面间的传值。
三、与使用 Form 的方法相似,该方法也能保持大量的数据,缺点也相同,但使用方法相对比较简单。
8、ViewState
核心代码:
//Class1 ViewState["id"]=TextBox1.Text; //数据保存 Label1.Text=ViewState["id"].ToString(); //数据取出 ViewState.Remove("id"); //数据移除
总结:
一、ViewState 是ASP.NET 用来在同一页面的多个请求之间保存和还原服务器控件视图状态的一种机制。与传统的“同一页面”不一样,ASP.NET 中“同一页面”的
每个请求都会致使服务器从新生成该页面,可是新生成的页面并不包含原来页面的数据。(页面无状态性)
二、ViewState 的任务就是保存原来页面中服务器控件视图状态的数据供新页面使用。从这个意义上讲,ViewState 也能够看做是一种在页面间传递数据的工具。
三、ViewState 的工做原理是:做为一个隐藏的窗体字段在客户端和服务器之间传递,可见,滥用ViewState 会加剧页面回传的负担,从而下降应用程序的性能。
此外,ViewState 也能被控件、页面和应用程序禁用。
9、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"];
总结:
一、每一个Web运用程序继承web.config文件和machine.config文件的设置。
二、web.config和machine.config这两种文件保存数据通常都很小,多为明文,特别适合保存一些字符串常量,如数据库链接信息。此外,web.config文件是能够
扩展的,所以,也能够用来传递变量。因为这两种文件会被自动缓存,因此不存在因磁盘IO产生的性能瓶颈等问题。要注意的是文件中某些设置会致使文件被修改后
Web运用程序的重启。
三、web.config:你能够向单个Web运用程序运用设置。例如,你可能会但愿设置特定的验证方法、调试的类型、默认语言或自定义的错误页面。但若是你要使用这些
设置,必须把web.config文件放到web运用程序的根虚拟目录下。要想在Web运用程序中进一步配置本身的子目录,须要 在这些文件夹中放置附加的web.config。
(关于ASP.NET web.config文件详细介绍,可参考我另一篇博客:ASP.NET web.config)
四、machine.config:从c:\Windows\Microsoft.NET\Framework\Framework\[Version]\Config目录中的一个叫macine.config的文件开始 配置。machine.config
文件定义支持的配置文件节,配置ASP.NET工做者进程,注册可用于高级特性(如配置文件、成员资格以及基于角色的安全等)提供程序。(关于ASP.NET machine.config
文件的详细介绍,我以后会写一篇文章来介绍)
10、Static
核心代码:
//class1 public static string userName;//在class1中定义静态全局变量 userName=txtBoxUserName.Text; Response.Redirect("~/class2.aspx"); //class2 Label1.Text=Src.id;
总结:
一、这个应该是很是容易理解的,在ASP.NET中,每一个页面对应一个具体的类,既然如此,那么页面之间的传递,咱们就能够归结为:类与类之间数据的传递。想到这一步,问题应该
就迎刃而解了, 由于咱们能够利用类之间的公关静态变量来解决这个问题。
二、若合理利用,能够有效地提升数据传递效率,但若滥用,可能会致使用户或页面间数据紊乱,存在必定风险和隐患,应谨慎使用。
提出如下问题:你们能够分析一下,如下代码有什么问题?
//Class1 protected void btnRedirect_Click(object sender, EventArgs e) { string userName = txtBoxUserName.Text; Response.Redirect("~/Class2.aspx"); } //Class2 Lable1.Text=userName;
11、补充经常使用页面之间跳转
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等等,在这里就不一一论述了。若之后有时间,将会在此基础上补充,并逐步完善该篇博文。
注释:很是感谢你们的拜读并指教,有些读者朋友提出对文中某些内容不该该归为页面间的传值,如web.config,数据库等。关于这个
问题,我以为对页面间的传值,每一个人都有本身的标准,标准不同,结果应该就不同。
申明一下,本篇博文中,关于页面间传值,我是这样定义的,“页面间的传值”指在页面间确实可以传递参数,传递数据的,而并不是是某
些教课书上的教条八股文,把页面间传值定义死了,我这种定义是基于实际问题,实际能解决页面间传值的,即只要能解决页面间传值
的,就能够归结为页面间传值这一类。