20编程21编程爱好者22vb编程,23数控编程24编程中国25编程论坛26编程语言27游戏编程28编程软件下载29编程工具30socket编程31网络编程32编程器33c语言编程,34flash编程35编程软件36数控车床编程37windows编程38编程入门,39windows核心编程40cnc编程41vc 编程,42linux 编程43asp编程44vb编程实例45串口编程46手机编程47编程教程48plc编程,49单片机编程50vc 网络编程51excel编程,52unix网络编程53编程学习,54编程之道55数据库编程56单片机编程器57黑客编程58计算机编程59网页编程60嵌入式编程,61编程高手箴言62flash编程教程63vfp编程64windows网络编程,65编程基础66c语言编程实例67c语言编程软件68vf编程69shell编程,70vb数据库编程71matlab编程,72c语言编程工具73编程思想74php编程,75c编程76jsp编程77电脑编程技巧与维护,78三菱plc编程软件,79vb编程软件下载80pb编程81数控编程实例82asp编程工具,83c专家编程,84win32编程85数控铣床编程86asp.net高级编程,,87vc 数据库编程88vba编程89jsp高级编程90c语言编程宝典,91unix环境高级编程;92编程珠玑93delphi编程94delphi数据库编程95vb编程教程96单片机编程软件
1编程爱好者网站2vb编程网站,3电子商务网站编程4游戏编程网站5最大的编程网站6网站编程软件7可编程逻辑中文网站8网站 编程 语言9网站编程 数据库,10jsp网站编程11asp编程网站12网站编程电子书13好的编程网站,14c语言编程网站15编程门户网站16如何学习网站编程17百度网站的编程语言18vb编程乐园网站指南19wince 编程网站
1asp.net2asp教程,3asp源码4asp免费空间5asp论坛6asp代码7asp源代码8asp下载,9asp源码下载10asp木马11asp.net教程12asp学习13什么是asp14asp空间,15admin.asp dir16asp程序17asp教程下载18asp.net 2.019asp整站程序,20asp文件21十天学会asp22asp入门23asp源程序24asp实例25asp函数26asp服务器27asp.net论坛28asp id,29asp整站下载30asp网站31asp论坛下载32asp源代码下载,33asp整站34asp技术35asp access36asp.net源码37asp简介38asp免费空间申请39asp.net下载,40asp留言板41asp sql42asp 数据库43asp站长助手44asp连接数据库45asp留言本,46asp.net教程下载47asp分页48asp格式49asp论坛程序50asp.net源代码51asp软件52asp模板53asp session54asp语法,55如何打开asp文件56asp解密57asp编程58asp.net实例,59asp实例教程60asp程序下载61asp计数器62asp.net入门,63asp运行环境64asp基础教程65apache asp66asp入门教程,67asp编辑器68asp组件69asp连接access70conn.asp71asp书籍,72asp论文73asp工具74asp文件上传75asp探针76asp原代码下载77asp include78user wantpws.asp79asp split,80asp fso81asp网页制作82printpage.asp83什么是asp.net,84index.asp85asp.net datagrid86asp基础87asp replace88asp代码下载89asp新闻系统
1php论坛2免费php空间,3php下载4php源码5php mysql6php教程7php文件8php空间9apache php10什么是php11apache php mysql12php学习13php论坛下载14iis php15php cms16php入门17php blog18php手册,19php代码20php整站程序21php session22php安装23php源码下载24php配置25php源代码26php cookie27php网站28iis php mysql29php编程30php留言板31php探针32php注入33php.ini34php运行环境35index.php36php教程下载,37php论坛程序38php 文件上传39php服务器40php环境41php 函数;42php格式43php编辑器44php editor45如何打开php文件46php access47十天学会php48php模板49php xml;50php程序51php留言本52php文件怎么打开53php技术54ajax php55php简介56php注入工具57打开php文件58php语言59php mail;60php软件;61免费php mysql空间62php self63php 数组.64php分页,65php nuke66php阅读器67免费php空间申请68国外免费php空间69php程序下载70php 正则表达式71asp php,72php网站管理系统73php程序设计74php是什么文件75php 实例76php 开发工具77php 验证码78php官方网站79php学习资料
1jsp教程2jsp源码3jsp论坛4什么是jsp5jsp源代码6jsp空间7jsp学习8jsp文件9jsp mysql,10jsp入门11jsp连接数据库12jsp技术13eclipse jsp14jsp分页15jsp源代码下载16jsp access17jsp教程下载18jsp开发工具,19jsp代码20jsp简介21jsp环境配置22jsp连接mysql,23jsp实例24免费jsp空间25jsp配置26jsp session,27jsp运行环境28jsp下载29jsp网站30jsp include31jsp编程,32jsp介绍33jsp 数据库34jsp设计35jsp servlet36jsp标签37jsp应用开发详解38jsp 中文39jsp oracle40jsp论文41jsp 文件上传,42jsp高级编程43jsp源码下载44jsp 乱码45jsp开发46jsp分页显示47jsp sql48jsp连接sql49jsp 页面跳转50jsp request51eclipse开发jsp52iis jsp53jsp开发环境54jsp sqlserver,55jsp cookie56jsp服务器57jsp连接access58jsp毕业论文59jsp新闻发布系统60jsp留言板61jsp 电子书62jsp forward63jsp中文网64tomcat jsp65jsp语法66jsp留言本67asp jsp,68jsp import69jsp源程序70jsp基础71jsp毕业设计,72jsp格式73jsp 中文乱码,74jsp开发实例75jsp书籍76jsp论坛下载77jsp 上传,78jsp计数器79jsp 注释80jsp电子教程81jsp 保存用户名密码,82jsp的优点83jsp软件下载84jsp语言85jsp代码下载86jsp blog87jsp 打印88jsp手册

思顿科技-专业网站制作指南、网页设计制作教程、免费网页制作素材下载、免费学习网页制作指南,专业网站建设服务、网站制做指南、免费网页制作指南、网页制作服务、免费空间域名服务、
首页
网页教程
网页素材
收录查询
工具下载
网站欣赏
网站论坛
免费博客
建站服务

ASP.NET保持用户状态的九种选择(上)
你当前的位置:网站制作指南 --> 技术文档全集 (www.STasp.com)

  摘要:ASP.NET为保持用户请求之间的数据提供了多种不同的途径。你可以使用APPLICATION对象、COOKIE、HIDDEN FIELDS、SESSIONS或CACHE对象,以及它们的大量的方法。决定什么时候使用它们有时很困难。本文将介绍了上述的技术,给出了什么时候使用它们的一些指导。尽管这些技术中有些在传统ASP中已经存在,但是有了.NET框架组件后该在什么时候使用它们发生了变化。为了在ASP.NET中保持数据,你需要调整从先前的ASP中处理状态中学习到的知识。
  随着WEB时代的到来,在无状态的HTTP世界中管理状态成为WEB开发者的一个大问题。最近出现了几种存储和检索数据的不同技术。本文我将解释ASP.NET开发者能怎样通过页面请求维护或传递状态。

  在ASP.NET中,有几种保持用户请求间数据的途径--实际上太多了,使没有经验的开发者对在哪个特定的环境下使用哪个对象很困惑。为了回答这个问题,需要考虑下面三个条件:

   .谁需要数据?

   .数据需要保持多长时间?

   .数据集有多大?

  通过回答这些问题,你能决定哪个对象为保持ASP.NET应用程序请求间数据提供了最佳的解决方案。图1列出了不同的状态管理对象并描述了什么时候使用它们。ASP.NET中添加了四个新的对象:CACHE、CONTEXT、VIEWSTATE和WEB.CONFIG文件。ASP.NET也支持传统的ASP对象,包括APPLICATION、 COOKIE、有隐藏字段的 FORM POST 、 QUERYSTRING和SESSIONS。注意这五个数据容器的正确使用方法发生了改变,因此有经验的程序员在考虑这些熟悉的对象时也许需要学习一些知识。


保持方法谁需要数据保持多长时间数据量大小
APPLICATION所有用户整个应用程序生命期任意大小
COOKIE一个用户可以很短,如果用户不删除也可以很长小的、简单数据
FORM POST一个用户到下一次请求(可以跨越多个请求重复使用)任意大小
QUERYSTRING一个或一组用户 到下一次请求(可以跨越多个请求重复使用)小的、简单数据
SESSIONS一个用户用户活动时一直保持+一段时间(一般20分钟)可以是任何大小,但是因为用户有单独的SESSIONS 存储,所有它应该最小。
CACHE 所有用户或某些用户根据需要可大可小、可简单可复杂
CONTEXT一个用户 一个请求可以保持大对象,但是一般不这样使用
VIEWSTATE 一个用户一个WEB窗体最小
CONFIG FILE所有用户 知道配置文件被更新 可以保持大量数据,通常组织小的字符串和XML结构

表1. ASP.NET中的数据容器对象

  APPLICATION

  让我们通过回答上面的状态问题判定条件来说明该对象。谁需要数据?所有的用户需要访问它。需要保持数据多长时间?永久保持,或在应用程序生存期中保持。数据多大?可以是任何大小--在任何给定的时刻只有数据的一个副本存在。

  在传统ASP中,APPLICATION对象提供了一个保存频繁使用但很少改变的数据片的位置,例如菜单内容和参考数据。尽管在ASP.NET 中APPLICATION依然作为数据容器存在,但是有其它一些更适合以前保存在传统ASP应用程序的APPLICATION集合中的数据的对象。

  在传统的ASP中,如果被保存的数据在应用程序的生存期中根本不会改变(或很少改变,例如只读数据和大多数情况下是读操作的数据),APPLICATION对象是理想的选择。连接字符串就是保存在APPLICATION变量中的一个最普通的数据片,但是在ASP.NET中类似的配置数据最好保存在WEB.CONFIG文件中。如果使用APPLICATION对象一个需要考虑的问题是任何写操作要么在APPLICATION_ONSTART事件(GLOBAL.ASAX)中,要么在APPLICATION.LOCK部分中完成。尽管使用APPLICATION.LOCK来确保写操作正确地执行是必要的,但是它串行化了对APPLICATION对象的请求,而这对于应用程序来说是个严重的性能瓶颈。图2演示了怎样使用APPLICATION对象,它包括一个WEB窗体和它的代码文件。

  APPLICATION.ASPX


<FORM ID="APPLICATION" METHOD="POST" RUNAT="SERVER">
<ASP:VALIDATIONSUMMARY ID="VALSUMMARY" RUNAT="SERVER">
</ASP:VALIDATIONSUMMARY>
<TABLE>
<TR>
<TD COLSPAN="3">SET APPLICATION VARIABLE:</TD>
</TR>
<TR>
<TD>NAME</TD>
<TD><ASP:TEXTBOX ID="TXTNAME" RUNAT="SERVER"></ASP:TEXTBOX>
</TD>
<TD><ASP:REQUIREDFIELDVALIDATOR ID="NAMEREQUIRED"
RUNAT="SERVER" DISPLAY="DYNAMIC" ERRORMESSAGE="NAME IS
REQUIRED." CONTROLTOVALIDATE="TXTNAME">*
</ASP:REQUIREDFIELDVALIDATOR></TD>
</TR>
<TR>
<TD>VALUE</TD>
<TD><ASP:TEXTBOX ID="TXTVALUE" RUNAT="SERVER">
</ASP:TEXTBOX></TD>
<TD><ASP:REQUIREDFIELDVALIDATOR ID="VALUEREQUIRED"
RUNAT="SERVER" DISPLAY="DYNAMIC" ERRORMESSAGE="VALUE IS
REQUIRED." CONTROLTOVALIDATE="TXTVALUE">*
</ASP:REQUIREDFIELDVALIDATOR></TD>
</TR>
<TR>
<TD COLSPAN="3"><ASP:BUTTON ID="BTNSUBMIT" RUNAT="SERVER"
TEXT="UPDATE VALUE"></ASP:BUTTON></TD>
</TR>
</TABLE>
<ASP:LABEL ID="LBLRESULT" RUNAT="SERVER" />
</FORM>
APPLICATION.ASPX.CS
PRIVATE VOID BTNSUBMIT_CLICK(OBJECT SENDER, SYSTEM.EVENTARGS E)
{
IF(ISVALID)
{
APPLICATION.LOCK();
APPLICATION[TXTNAME.TEXT] = TXTVALUE.TEXT;
APPLICATION.UNLOCK();
LBLRESULT.TEXT = "THE VALUE OF <B>" + TXTNAME.TEXT +
"</B> IN THE APPLICATION OBJECT IS <B>" +
APPLICATION[TXTNAME.TEXT].TOSTRING() + "</B>";
}

代码段1.在ASP.NET中访问APPLICATION对象

  它的输出如下图所示:

图1. APPLICATION对象的内容

  注意图3中APPLICATION对象的内容是追踪输出的显示。追踪是个伟大的调试工具,但是在某个点,被打开的有追踪的页面可能出现在产品环境中。如果出现这种情况,你肯定不希望显示敏感的信息。这就是为什么APPLICATION对象从来不是推荐的存放敏感信息(例如连接字符串)的位置的主要原因之一。

  COOKIES

  当特定的用户需要特定的数据片,并且需要把数据在某个可变的时段中保持的时候,COOKIE就非常方便。它的生命周期可能与浏览器窗体的一样短,也可以长达数月、数年。COOKIE可以小到只有几个字节的数据,因为它们在每个浏览器请求中传递,它们的内容需要尽可能的小。

  COOKIE提供了一条灵活的、强大的维护用户请求间数据的途径,这就是为什么INTERNET上大多数动态站点使用它们的原因。因为COOKIE可以存储的数据量很受限制,最好只在COOKIE中保存键字段,其它的数据保存在数据库或其它的服务器端数据容器中。但是由于不是所有的浏览器都支持COOKIE,并且它可以被用户禁止或删除,因此它们也不能用于保存关键数据。你应该很好地处理用户的COOKIE被删除的情况。最后,COOKIE作为简单的明文文本保存在用户的计算机中,因此在它里面不能保存敏感的、未加密的数据。

图2.单值和多值COOKIE

  有种特殊的COOKIE可以保存单个值或名称/值对的集合。图4显示了单个和多个值COOKIE的示例,通过ASP.NET的内建追踪特性输出。这些值可以在ASP.NET页面中使用REQUEST.COOKIES和RESPONSE.COOKIES集合来维护,这在代码段2中演示。

  COOKIES.ASPX.CS

//使用HTTPCOOKIE类是指COOKIE的值和/或子值
HTTPCOOKIE COOKIE;
IF(REQUEST.COOKIES[TXTNAME.TEXT] == NULL)
COOKIE = NEW HTTPCOOKIE(TXTNAME.TEXT, TXTVALUE.TEXT);
ELSE
COOKIE = REQUEST.COOKIES[TXTNAME.TEXT];
IF(TXTSUBVALUENAME.TEXT.LENGTH > 0)
COOKIE.VALUES.ADD(TXTSUBVALUENAME.TEXT, TXTSUBVALUEVALUE.TEXT);
COOKIE.EXPIRES = SYSTEM.DATETIME.NOW.ADDDAYS(1); // TOMORROW
RESPONSE.APPENDCOOKIE(COOKIE);
//检索COOKIE的值
IF(!REQUEST.COOKIES[TXTNAME.TEXT].HASKEYS)
LBLRESULT.TEXT = "THE VALUE OF THE <B>" + TXTNAME.TEXT + "</B>
COOKIE IS <B>" + REQUEST.COOKIES[TXTNAME.TEXT].VALUE.TOSTRING() +
"</B>";
ELSE
{
LBLRESULT.TEXT = "THE VALUE OF THE <B>" + TXTNAME.TEXT + "</B>
COOKIE IS <B>" + REQUEST.COOKIES[TXTNAME.TEXT].VALUE.TOSTRING() +
"</B>, WITH SUBVALUES:<BR>";
FOREACH(STRING KEY IN REQUEST.COOKIES[TXTNAME.TEXT].VALUES.KEYS)
{
LBLRESULT.TEXT += "[" + KEY + " = " +
REQUEST.COOKIES[TXTNAME.TEXT].VALUES[KEY].TOSTRING() + "]<BR>";
}
}
删除COOKIE
// 把的值设置为空并把终止时间设置为过去某个时刻
RESPONSE.COOKIES[TXTNAME.TEXT].VALUE = NULL;
RESPONSE.COOKIES[TXTNAME.TEXT].EXPIRES =
SYSTEM.DATETIME.NOW.ADDMONTHS(-1); //上个月

代码段2.ACCESSING 在ASP.NET中访问COOKIES

  FORM POST / 隐藏的窗体字段

  特定的用户需要窗体的数据,并且它需要在单个请求到应用程序终止的任何阶段都保持。这些数据事实上可以是任意大小的,它随着每个FORM POST在网络上向前和向后发送。

  在传统的ASP中,这是在应用程序中暴露状态的通常的途径,特别是在多页面窗体应用程序中。但是在ASP.NET中这种技术不太适合了,因为只要你使用POSTBACK模型(也就是页面发回给自己),WEB控件和VIEWSTATE自动处理了这些操作。VIEWSTATE是ASP.NET对这种技术的实现,我将在本文的后部分讨论它。访问通过POST发送的窗体值是使用HTTPREQUEST对象的窗体集合完成的。在图6中,一个ASP.NET页面设置了某个用户的ID,在这以后它保持在一个隐藏的窗体字段中。后面的向任何页面的请求保留这个值,直到页面使用SUBMIT按钮链接到其它的用户。

  FORM1.ASPX


<H1>FORM 1</H1>
<FORM ID="APPLICATION" METHOD="POST" RUNAT="SERVER">
<P>YOUR USERNAME:
<ASP:LABEL ID="LBLUSERNAME" RUNAT="SERVER" />
</P>
<ASP:PANEL RUNAT="SERVER" ID="PNLSETVALUE">
<ASP:VALIDATIONSUMMARY ID="VALSUMMARY" RUNAT="SERVER">
</ASP:VALIDATIONSUMMARY>
<TABLE>
<TR>
<TD COLSPAN="3">SET HIDDEN FORM USERNAME VARIABLE:</TD></TR>
<TR>
<TD>USERNAME</TD>
<TD>
<ASP:TEXTBOX ID="TXTNAME" RUNAT="SERVER"></ASP:TEXTBOX></TD>
<TD>
<ASP:REQUIREDFIELDVALIDATOR ID="NAMEREQUIRED" RUNAT="SERVER"
CONTROLTOVALIDATE="TXTNAME" ERRORMESSAGE="NAME IS REQUIRED."
DISPLAY="DYNAMIC">*</ASP:REQUIREDFIELDVALIDATOR></TD></TR>
<TR>
<TD COLSPAN="3">
<ASP:BUTTON ID="BTNSUBMIT" RUNAT="SERVER" TEXT="SET VALUE">
</ASP:BUTTON></TD></TR></TABLE>
</ASP:PANEL>
<ASP:LABEL ID="LBLRESULT" RUNAT="SERVER" />
</FORM>
<FORM ACTION="FORM2.ASPX" METHOD="POST" NAME="FORM2" ID="FORM2">
<INPUT TYPE="HIDDEN" NAME="USERNAME" VALUE="<%# USERNAME %>" >
<INPUT TYPE="SUBMIT" VALUE="GO TO FORM2.ASPX"
</FORM>
FORM1.ASPX.CS
PRIVATE VOID PAGE_LOAD(OBJECT SENDER, SYSTEM.EVENTARGS E)
{
IF(!ISPOSTBACK) // 新的请求或者来自FORM2.ASPX的请求
{
// 检查窗体集合
IF(REQUEST.FORM["USERNAME"] == NULL)
PNLSETVALUE.VISIBLE = TRUE;
ELSE
{
//需要设置用户名值
PNLSETVALUE.VISIBLE = FALSE;
USERNAME = REQUEST.FORM["USERNAME"].TOSTRING();
LBLUSERNAME.TEXT = USERNAME;
//数据绑定到隐藏的窗体字段值
THIS.DATABIND();
}
}
}

PRIVATE VOID BTNSUBMIT_CLICK(OBJECT SENDER, SYSTEM.EVENTARGS E)
{
IF(ISVALID)
{
//隐藏窗体来设置值
PNLSETVALUE.VISIBLE = FALSE;
USERNAME = TXTNAME.TEXT;
LBLRESULT.TEXT = "USERNAME SET TO " + TXTNAME.TEXT + ".";
LBLUSERNAME.TEXT = USERNAME;
THIS.DATABIND();
}
}
FORM2.ASPX
<H1>FORM 2</H1>
<FORM ID="APPLICATION" METHOD="POST" RUNAT="SERVER">
<P>YOUR USERNAME: <ASP:LABEL ID="LBLUSERNAME" RUNAT="SERVER" /></P>
</FORM>
<FORM ACTION="FORM1.ASPX" METHOD="POST" ID="FORM2" NAME="FORM2">
<INPUT TYPE="HIDDEN" NAME="USERNAME" VALUE="<%# USERNAME %>" >
<INPUT TYPE="SUBMIT" VALUE="GO TO FORM1.ASPX"
</FORM>
FORM2.ASPX.CS
PRIVATE VOID PAGE_LOAD(OBJECT SENDER, SYSTEM.EVENTARGS E)
{
IF(REQUEST.FORM["USERNAME"] != NULL)
{
USERNAME = REQUEST.FORM["USERNAME"].TOSTRING();
LBLUSERNAME.TEXT = USERNAME;
THIS.DATABIND();
}
}
 

代码段3.在ASP.NET中使用隐藏窗体字段

  在ASP.NET中一个页面上只能存在一个服务器端窗体,并且该窗体必须提交返回到自身(仍然可以使用客户端窗体,没有限制)。隐藏窗体字段再也没有用于在.NET框架组件上建立的应用程序间传递数据的主要原因之一是.NET框架组件控件都可以使用VIEWSTATE自动维护自己的状态。VIEWSTATE简单地把使用隐藏窗体字段设置和检索值所包含的工作封装进一个使用简单的集合对象中。

  QUERYSTRING

  QUERYSTRING对象中保存的数据由单独的用户使用。它的生命周期可能只有一个请求那么短,也可能有用户使用应用程序的时间那么长(如果构造正确的话)。这类数据一般小于1KB。QUERYSTRING中的数据在URL中传递,对于用户来说是可见的,因此你能猜到,使用这种技术时,敏感的数据或可用于控制应用程序的数据需要加密。

  也就是说,QUERYSTRING是在ASP.NET WEB窗体间发送信息的一条很好的途径。例如,如果有一个含有产品列表的数据表格(DATAGRID),并且在表格上有一个链接导向产品的细节页面,使用QUERYSTRING就是理想的,可以把产品的ID包含在链接到产品细节页面的QUERYSTRING中(例如PRODUCTDETAILS.ASPXID=4)。使用QUERYSTRINGS的另一个好处是页面的状态包含在URL中。这意味着用户可以把某个通过QUERYSTRINGS建立的窗体放入他的收藏夹中。当它们作为收藏返回到页面时,将与作收藏的时候一样。很明显这只在页面不依赖QUERYSTRING外的所有状态和不作任何改变的时候有作用。

  敏感数据,以及任何不希望用户操作的变量应该避免出现在此处(除非加密使用户不能阅读)。并且URL中不合法的字符必须使用SERVER.URLENCODE编码,如图7所示。当处理单个ASP.NET页面时,对维护状态来说VIEWSTATE是比QUERYSTRING好的选择。对于长期的数据存储,COOKIE、SESSIONS或CACHE都比QUERYSTRINGS更加适于作为数据容器。

  QUERYSTRING.ASPX


<FORM ID="QUERYSTRING" METHOD="POST" RUNAT="SERVER">
<ASP:VALIDATIONSUMMARY ID="VALSUMMARY" RUNAT="SERVER">
</ASP:VALIDATIONSUMMARY>
<TABLE>
<TR>
<TD COLSPAN="3">SET QUERYSTRING VARIABLE:</TD>
</TR>
<TR>
<TD>NAME</TD>
<TD><ASP:TEXTBOX ID="TXTNAME" RUNAT="SERVER"></ASP:TEXTBOX>
</TD>
<TD><ASP:REQUIREDFIELDVALIDATOR ID="NAMEREQUIRED"
RUNAT="SERVER" DISPLAY="DYNAMIC" ERRORMESSAGE="NAME IS
REQUIRED." CONTROLTOVALIDATE="TXTNAME">*
</ASP:REQUIREDFIELDVALIDATOR></TD>
</TR>
<TR>
<TD>VALUE</TD>
<TD><ASP:TEXTBOX ID="TXTVALUE" RUNAT="SERVER">
</ASP:TEXTBOX></TD>
<TD><ASP:REQUIREDFIELDVALIDATOR ID="VALUEREQUIRED"
RUNAT="SERVER" DISPLAY="DYNAMIC" ERRORMESSAGE="VALUE IS
REQUIRED." CONTROLTOVALIDATE="TXTVALUE">*
</ASP:REQUIREDFIELDVALIDATOR></TD>
</TR>
<TR>
<TD COLSPAN="3"><ASP:BUTTON ID="BTNSUBMIT" RUNAT="SERVER"
TEXT="UPDATE VALUE"></ASP:BUTTON></TD>
</TR>
</TABLE>
<ASP:LABEL ID="LBLRESULT" RUNAT="SERVER" />
<A HREF="QUERYSTRING.ASPXX=1">SET QUERYSTRING X EQUAL TO 1</A>
</FORM>
QUERYSTRING.ASPX.CS
PRIVATE VOID PAGE_LOAD(OBJECT SENDER, SYSTEM.EVENTARGS E)
{
// 检索COOKIE的值
IF(REQUEST.QUERYSTRING.HASKEYS())
{
LBLRESULT.TEXT = "THE VALUES OF THE <B>" + TXTNAME.TEXT +
"</B> QUERYSTRING PARAMETER ARE:<BR>";
FOREACH(STRING KEY IN REQUEST.QUERYSTRING.KEYS)
{
LBLRESULT.TEXT += "[" + KEY + " = " +
REQUEST.QUERYSTRING[KEY].TOSTRING() + "]<BR>";
}
}
}

PRIVATE VOID BTNSUBMIT_CLICK(OBJECT SENDER, SYSTEM.EVENTARGS E)
{
IF(ISVALID)
{
STRING URL = "QUERYSTRING.ASPX";
FOREACH(STRING KEY IN REQUEST.QUERYSTRING.KEYS)
{
URL += KEY + "=" + REQUEST.QUERYSTRING[KEY].TOSTRING() + "&";
}
RESPONSE.REDIRECT(URL + TXTNAME.TEXT + "=" +
SERVER.URLENCODE(TXTVALUE.TEXT));
}
}
 

代码段4.在ASP.NET中使用QUERYSTRINGS传递数据


  SESSIONS

  SESSIONS数据对于特定的用户是特定的。它的生存期是用户持续请求的时间加上后来一段时间(一般是20分钟)。SESSIONS可以保持或大或小的数据量,但是如果应用程序用于成百上千的用户,那么总共的存储应该保持最小。

  不幸的是在传统的ASP中SESSIONS对象的名声很不好,因为它把应用程序约束到特定的计算机上,阻碍了用户分组和WEB范围的可伸缩性。在ASP.NET中几乎没有这些问题,因为改变SESSIONS保存的位置很简单。在默认情况下(性能最好的情况),SESSIONS数据仍然保存在本地WEB服务器的内存中,但是ASP.NET支持使用外部状态服务器或数据库管理SESSIONS数据。

  使用SESSIONS对象很简单,并且它的语法与传统ASP相同。但是SESSIONS对象是保存用户数据的方法中效率很低的一种,因为即使用户停止使用应用程序后它仍然保持在内存中一段时间。这对于非常繁忙的站点的可伸缩性有严重的影响。其它的选择允许对释放内存的更多的控制,例如CACHE对象也许更适合大量的大数据值。并且在默认情况下ASP.NET SESSIONSS依赖于COOKIE,因此如果用户禁止或不支持COOKIE,SESSIONSS就不能工作,但是可以配置SESSIONSS支持COOKIE无关。对于小的数据量,SESSIONSS对象是保存只需要在用户当前对话中保持的特定数据的极好位置。下面的例子演示了怎样设置和从SESSIONSS对象中检索值:


PRIVATE VOID BTNSUBMIT_CLICK(OBJECT SENDER, SYSTEM.EVENTARGS E)
{
 IF(ISVALID)
 {
  // 设置SESSIONS值
  SESSIONS[TXTNAME.TEXT] = TXTVALUE.TEXT;

  //读取和显示刚才的设置
  LBLRESULT.TEXT = "THE VALUE OF <B>" + TXTNAME.TEXT + "</B> IN THE SESSIONS OBJECT IS <B>" + SESSIONS[TXTNAME.TEXT].TOSTRING() + "</B>";
 }
}
 

  该WEB窗体与APPLICATION对象中使用的几乎相同,当允许页面追踪时SESSIONS集合的内容也是可见的。
你需要记住的是即使没有使用,SESSIONSS也会有应用程序开销。把SESSIONSS状态设置为只读的也可以优化只需要读而不需要写数据的页面。可以使用下面两种途径之一来配置SESSIONSS:


<%@ PAGE ENABLESESSIONSSTATE="FALSE" %>
<%@ PAGE ENABLESESSIONSSTATE="READONLY" %>

  ASP.NET SESSIONSS可以在WEB.CONFIG或MACHINE.CONFIG中的SESSIONSSTATE元素中配置。下面是在 WEB.CONFIG中的设置的例子:


<SESSIONSSTATE TIMEOUT="10" COOKIELESS="FALSE" MODE="INPROC" />


 

 
| 关于我们 | 联系我们 | 业务合作 | 友情链接 | 网站地图 |
版权所有©思顿科技-专业网站制作指南2004-2006 在线技术支持- QQ:63127313