【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式
ASP.NET MVC系列文章
【02】浅谈Google Chrome浏览器(操作篇)(上)
【03】浅谈Google Chrome浏览器(操作篇)(下)
【04】浅谈ASP.NET框架
【07】浅谈ASP.NET MVC 路由
【08】浅谈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等等。
详解每种方法
一、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 = ; 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(,,));
总结:
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等等,在这里就不一一论述了。若以后有时间,将会在此基础上补充,并逐步完善该篇博文。
注释:非常感谢大家的拜读并指教,有些读者朋友提出对文中某些内容不应该归为页面间的传值,如web.config,数据库等。关于这个
问题,我觉得对页面间的传值,每个人都有自己的标准,标准不一样,结果应该就不一样。
申明一下,本篇博文中,关于页面间传值,我是这样定义的,“页面间的传值”指在页面间确实能够传递参数,传递数据的,而并非是某
些教课书上的教条八股文,把页面间传值定义死了,我这种定义是基于实际问题,实际能解决页面间传值的,即只要能解决页面间传值
的,就可以归结为页面间传值这一类。
- 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
- 博主网址:http://www.cnblogs.com/wangjiming/。
- 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
- 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
- 可以转载该博客,但必须著名博客来源。
【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式的更多相关文章
- ASP.NET 页面之间传值的几种方式
开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有 ...
- ASP.NET页面之间传值的几种方式
1. QueryString 当页面上的form以get方式向页面发送请求数据时,web server将请求数据放入一名为QEURY_STRING的环境变量中,QeueryString方法从这个变量 ...
- ASP.NET页面间传值的几种方式
ASP.NET页面间传值的几种方式 1.使用QueryString 使用QuerySting在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在 ...
- ASP.NET MVC下自定义错误页和展示错误页的几种方式
在网站运行中,错误是不可避免的,错误页的产生也是不可缺少的. 这几天看了博友的很多文章,自己想总结下我从中学到的和实际中配置的. 首先,需要知道产生错误页的来源,一种是我们的.NET平台抛出的,一种是 ...
- 浅谈 EF CORE 迁移和实例化的几种方式
出于学习和测试的简单需要,使用 Console 来作为 EF CORE 的承载程序是最合适不过的.今天笔者就将平时的几种使用方式总结成文,以供参考,同时也是给本人一个温故知新的机会.因为没有一个完整的 ...
- [OpenSource]浅谈.Net和Java互相调用的三种方式
在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...
- 浅谈.Net和Java互相调用的三种方式
在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...
- 【ASP.NET MVC系列】浅谈NuGet在VS中的运用
一 概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...
- 【ASP.NET MVC系列】浅谈表单和HTML辅助方法
[01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP. ...
随机推荐
- MySQL系统变量 sql_mode 详解
转载自:http://tech.it168.com/a2012/0822/1388/000001388401_all.shtml MySQL数据类型:SQL_MODE设置不容忽视 SQL_MODE可能 ...
- Unity加载AB资源
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AssetBun ...
- 【Golang】如何统一处理HTTP请求中的异常捕获
最近写GOLANG项目,不使用框架,路由选择httprouter 现在想实现一个需求:在不修改httprouter源码的前提下,对所有注册的路由handle进行异常捕获. 大家都知道golang使用p ...
- ‘params’一个奇妙的东西
params关键字表示函数的参数是可变个数的,即可变的方法参数,例如Console.WriteLine( "{0},{1} ",i,j); 就像DELPHI 里 WRITELN 函 ...
- idea 中dao层自动生成接口
1.在生成接口的类上右键 2.选中要生成的接口方法 3.点击Yes 4.出现(? reference in ? file)即生成成功
- 基于fpga的vga学习(2)
本次学习主要向配合basys2实行. 上次学习vga的rgb三个output都是1位的,但是我看了basys2的rgb分别是332位,这里让我卡顿了很久, 之后通过查资料才知道,rgb的不同大小表示的 ...
- C#-Database-连接
using System.Data; using System.Data.SqlClient; //先打开两个类库文件 SqlConnection con = new SqlConnection(); ...
- UDF函数 解码url
背景 URL 的编码 是ASCII十六进制格式.数仓接受到前端上报的URL,要对URL字段解码. 如要将 https"Fmybook.do%3Frequest_type%3D%26type% ...
- Python之旅Day7 面向对象&异常处理
########################################面向对象初识######################################### 面向对象简介 面向对象编 ...
- 传统asp.net小心 async/await坑
最近在改老项目时,干了一件自以为很有成就感的事,心想 “项目都是同步方法,为啥不用异步方法呢?”,于是有了异步方法,类型下面的代码(当然是举例子说明啊) //更新某人名下公司名称 public Tas ...