- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解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 。
核心代码:
1
2
3
4
5
|
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”.
2、Request.Form 。
核心代码:
1
2
3
4
5
|
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、获取表单指定名字的参数值.
3、Session 。
1、Session基本操作 。
a、创建Session 。
1
2
3
4
5
6
7
8
9
10
11
|
//创建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的值 。
1
|
string
getSessionValue=Session[
"name"
].ToString();
|
c、遍历Session 。
1
2
3
4
5
6
7
8
9
|
//遍历Session
public
void
getSession()
{
IEnumerator sessionEnum = Session.Keys.GetEnumerator();
while
(sessionEnum.MoveNext())
{
Response.Write(Session[sessionEnum.Current.ToString()].ToString()+
";"
);
}
}
|
d、清空Session,但不结束会话 。
1
2
3
4
5
|
//清空Session,但不结束会话
public
void
clearSession()
{
Session.Clear();
}
|
e、结束Session会话 。
1
2
3
4
5
|
//结束Session会话
public
void
abandonSession()
{
Session.Abandon();
}
|
2、Session数据存放形式和位置 。
1
2
3
4
|
<
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. 。
4、Application 。
核心代码:
(1)a.aspx 。
1
2
3
4
|
private
void
Button1_Click(
object
sender, System.EventArgs e)
{
Application[
"name"
] = Label1.Text;
}
|
(2)b.aspx 。
1
2
3
4
5
6
7
|
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方法用来锁定和解锁,为了防止并发修改。 。
5、Cache 。
核心代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//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、该方法的优点是传递数据的大小和数量无限制,速度快。缺点是缓存机制的操作相对比较复杂.
6、Cookie 。
核心代码: 。
1
2
3
4
5
6
7
|
//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、安全性不高,容易伪造。 。
7、Context.Items["id"] 。
核心代码:
1
2
3
4
5
6
7
8
|
//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 的方法类似,该方法也能保持大量的数据,缺点也相同,但使用方法相对比较简单.
8、ViewState 。
核心代码:
1
2
3
4
|
//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 也能被控件、页面和应用程序禁用.
9、web.config和machine.config 。
核心代码:
1
2
3
4
5
6
7
|
//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文件的详细介绍,我之后会写一篇文章来介绍) 。
10、Static 。
核心代码:
1
2
3
4
5
6
|
//class1
public
static
string
userName;
//在class1中定义静态全局变量
userName=txtBoxUserName.Text;
Response.Redirect(
"~/class2.aspx"
);
//class2
Label1.Text=Src.id;
|
总结:
1、这个应该是非常容易理解的,在ASP.NET中,每个页面对应一个具体的类,既然如此,那么页面之间的传递,我们就可以归结为:类与类之间数据的传递。想到这一步,问题应该就迎刃而解了, 因为我们可以利用类之间的公关静态变量来解决这个问题.
2、若合理利用,可以有效地提高数据传递效率,但若滥用,可能会导致用户或页面间数据紊乱,存在一定风险和隐患,应谨慎使用.
提出以下问题:大家可以分析一下,以下代码有什么问题?
1
2
3
4
5
6
7
8
9
10
11
12
|
//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等等,在这里就不一一论述了。若以后有时间,将会在此基础上补充,并逐步完善该篇博文.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/wangjiming/p/6275854.html 。
最后此篇关于详解ASP.NET 页面之间传值的几种方式的文章就讲到这里了,如果你想了解更多关于详解ASP.NET 页面之间传值的几种方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
假设我有父页面。 当我单击“打印”时,会打开一个新选项卡(页面)以进行打印预览。 我想要的是,当我单击“打印”时,父选项卡(页面)上应显示覆盖层,以停止进一步的工作,直到子选项卡关闭。 Because
我知道这是不可能的,但我想我还是会问这个问题。 我有一个 HTTPS 页面,并且正在动态创建一个表单。我想将表单发布到 HTTP 页面。在浏览器不弹出警告的情况下这可能吗?当我在 IE8 上执行此操作
在我的应用程序中,我实现了ajax 4.0客户端模板 目前我的模板位于同一个.aspx页面上。 (例如 Main.aspx) 但我想将它们外部化。(即所有 HTML 都会放在另一个页面上) 为此,我使
我目前正在构建自己的网络应用程序。在此应用程序的标题中有一个导航栏。 我将相同的导航栏添加到我的所有 html 页面,以便在页面之间导航时保持可见,并将导航元素设置为事件到我现在所在的页面。 我的
我们有一个在集成管道下运行的 IIS7 Intranet 站点,该管道主要是 ASP.Net,带有一些传统的经典 ASP 页面。该站点允许匿名访问大多数区域,但使用 Windows 身份验证来保护某些
有一个要求,我需要根据 div 标签的高度超过 700 像素的条件将大型 HTML 页面拆分为多个页面。 我还可以根据字数拆分页面。 下面的示例根据 HTML 标签分割页面,而我需要根据 div 高度
有两个 html 页面,如果在第一个页面中单击特定图像,它将转到第二个 html 页面。如果在第二个 html 页面上的任何地方单击它应该返回到第一页并将第二页完全显示在第一页的一个 div 中 1s
我有一个简单的 hello world Servant 应用程序。我需要向它添加一些静态或动态的 html 页面。我怎样才能做到这一点?在文档中没有提到它。注意我不想在 Haskell 代码中创建 h
我有两个文件 index.html 和 index2.html。这两个文件都在本地机器上的同一目录中(无法访问 PHP 等)。 我正在努力 Page Title 使用 jQuery 从 index.h
假设我有一个 JSP 页面 index.jsp User id:
我面临着一个对我来说非常陌生的情况。我会尽力让事情变得简单来解释它一步一步来。 1)在页面 A(用户表单)中,我从字段中获取一些值并将其作为 jQuery AJAX POST 发送到页面 B。这是主要
我正在尝试弄清楚如何从 buttons.html 获取用户按钮点击动态切换第二个列的可见性 userinput.html 。我正在使用 DataTables userinput.html表并认为我有
我有asp。净 mvc4 项目。 Angularjs 已集成。 我已经按照以前的要求构建了 HTML 页面和 WEB API 2。 现在出于某种原因,我必须使用 CSHTML 页面。以前我只有 web
我的网站包含大约 18 个不同的页面。以管理员身份登录后,我单击“页面”。 我看到了以下内容 All (20) | Mine (19) | Published (19) | Draft (1) No
Haskell 中每个函数都有手册页吗?换句话说,我可以在某处输入 man fst 并获取有关该函数的手册或帮助页面吗?我发现大量的功能势不可挡! 我正在使用 GHC 和 GHCi。 最佳答案 我不知
我一直在用github pages很长一段时间以来,并使用自定义域重定向功能来重定向我的 user website来自 prahladyeri.github.io到我自己的域名 https://www
我对 Github 有一个基本的了解:我知道如何创建、添加、提交、推送和克隆存储库。我也开始探索 Github 页面来托管我的项目。我的最新项目于 3 月开始并将其推送到 gh-page。从那以后,我
在尝试查看日志时,Airflow 会抛出一个带有以下消息的 oops 页面: File "/Users/user/.pyenv/versions/3.5.2/lib/python3.5/locale.
我已经按照此处列出的步骤 (https://pages.github.com/) 为我正在处理的网站设置了一个 GitHub 页面 我设置的站点当前托管在 IIS 下,并使用 URL Rewrite
我想将我的 domain.com 重定向到 openshift 页面 (openshift-app.rhcloud.com)。我已经按照描述完成了 here它有效。唯一的问题是,在任何网站上,我都不会
我是一名优秀的程序员,十分优秀!