热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

禁掉VIEWSTATE之后(三)

禁掉VIEWSTATE之后(一)禁掉VIEWSTATE之后(二)在前面两篇文章中,我们了解了VIEWSTATE的相关知识。在这里,我们可以再回头思考这个问题:什么时候可

禁掉VIEWSTATE之后(一)     

禁掉VIEWSTATE之后(二)

 

     在前面两篇文章中,我们了解了VIEWSTATE的相关知识。在这里,我们可以再回头思考这个问题:什么时候可以禁用VIEWSTATE?如果感到这个问题太抽象,那么考虑下面这个问题:

     仅就我们在 第一节中实现的效果为例,如果禁用掉VIEWSTATE,如何实现启用VIEWSTATE时同样的效果?
对于已经习惯了asp.net机制的同学来说,这无疑将是一个痛苦的过程。更不用说在GridView等控件中,VIEWSTATE说起到的关键作用了(参考 烙馅饼喽同学的评论)。VIEWSTATE为我们做了太多的事情,我都有点想向这位默默无闻的英雄致敬了,呵呵!
     但是这里有一个无法回避的问题,VIEWSTATE增大了页面。似乎正应了那句古话:“鱼和熊掌,不可兼得!”
     所以可能会有同学提出以下的问题:
     1. 我的确需要存储GridView的控件状态,因为我不想每次都去数据库读取数据进行绑定运算(据说数据库的操作经常是系统的性能瓶颈);
     2. 但是我又不希望出现大量的VIEWSTATE;
     3. 而且我已经习惯了ASP.NET的处理方式,不希望对程序进行太多额外的改动。
     有办法么?
     呵呵,有的。从APS.NET2.O开始,微软为我们提供了!顾名思义,这个类可以将VIEWSTATE存储在Session中,而不是Hidden Input中。这可以用于大数量级的VIEWSTATE处理,它的实现也异常简单,只需要在页面后台(cs文件)中添加以下代码:
     protected   override  PageStatePersister PageStatePersister
    {
        
get
        {
            
return   new  SessionPageStatePersister( this );
        }
    }

     然后,我们可以比较使用了SessionPagePersister的页面源代码和未使用SessionPagePersister的页面源代码,可以看到,VIEWSTATE的大小差距。

默认未使用SessionPagePersister
< input type = " hidden "  name = " __VIEWSTATE "  id = " __VIEWSTATE "  value = " /wEPDwUJMzY1MzQzMjM3D2QWAgIDD2QWAgINDzwrAA0CAA8WBB4LXyFEYXRhQm91bmRnHgtfIUl0ZW1Db3VudAKQTmQMFCsAARYGHgRUeXBlGSsBHgROYW1lBQRJdGVtHglEYXRhRmllbGQFASEWAmYPZBYWAgEPZBYCZg8PFgIeBFRleHQFATBkZAICD2QWAmYPDxYCHwUFATFkZAIDD2QWAmYPDxYCHwUFATJkZAIED2QWAmYPDxYCHwUFATNkZAIFD2QWAmYPDxYCHwUFATRkZAIGD2QWAmYPDxYCHwUFATVkZAIHD2QWAmYPDxYCHwUFATZkZAIID2QWAmYPDxYCHwUFATdkZAIJD2QWAmYPDxYCHwUFAThkZAIKD2QWAmYPDxYCHwUFATlkZAILDw8WAh4HVmlzaWJsZWhkZBgBBQxndndMYXJnZVNpemUPPCsACgEIAugHZLUwBYUzZxYn3Bl8dX4z95wP1H4o "   />


< input  type ="hidden"  name ="__VIEWSTATE"  id ="__VIEWSTATE"  value ="/wEPaA8FDzhjYzVhOWU5MGM2Nzk3YRgBBQxndndMYXJnZVNpemUPPCsACgEIAugHZGSWqXjymvf789VjkwDfpB6c6d+q"   />


     但是,这背后,究竟发生了什么?

     我们首先应该知道,在页面中,我们可以重写这两个方法(sp1234将VIEWSTATE存入服务器磁盘的方法就是这样实现的):
     LoadPageStateFromPersistanceMedium():
     SavePageStateFromPersistanceMedium():
     望文生义,我们就可以知道,以上这两个方法是用于加载(Load)和保存(Save)页面状态(PageState)到一个可持久化(Persistance)的介质(Medium)中的。如果用reflactor查看这两个方法,你会发现,他们其实只是封装了一个PageStatePersister实例的Load或Save方法。
     PageStatePersister其实是一个抽象类,它封装了处理VIEWSTATE的主要方法和属性(详细请参考MSDN)。
     它有两个子类:
     1. HiddenFieldPageStatePersister: 实现了将VIEWSTATE存放到 hidden input中(默认方式)
     2. SessionPageStatePersister: 实现了将VIEWSTATE存放到session中
     所以,当我们在页面中重写PageStatePersister属性之后,ASP.NET框架将使用SessionPageStatePersister来Load()和Save() VIEWSTAE。(这就是“面向对象”的强大之处!ASP.NET内部似乎还使用了Adapter设计模式,所以使得我们使用起来觉得异常的简单。)

     有人认为,这是对糟糕的VIEWSTATE状态机制的一种“补救”,但我更倾向于认为这是一种“扩展”——他仅仅是另一种选择而已,我们必须认识到:使用Session,也只是将负担转移到服务器内存而已。而Session的一个大问题是:它无法实时的清除,通常我们只是设定一个固定的“到期时间”,这无疑是比较缺乏灵活性的(过期时间设得过长,会造成内存资源的浪费;而过期时间设得过短,将会导致信息的丢失)。
推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了一道网络流题目hdu4888 Redraw Beautiful Drawings的解题思路。题目要求以行和列作为结点建图,并通过最大流算法判断是否有解以及是否唯一。文章详细介绍了建图和算法的过程,并强调在dfs过程中要进行回溯。 ... [详细]
author-avatar
喵屎柔_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有