自学Web开发第十五天-基于VB和ASP.NET;继续深入研究GridView,扩展到ViewState和Hidden控件,刷新GridView的功能实现。


在使用GridView时,各种事件都需要重新绑定,而绑定时候必须重新给 GridView.DataSource属性赋值,即重新设置数据源。在我们不使用数据源控件时,每次都需要查询数据库,或者设置数据集,十分占资源且麻烦。有没有直接使用现有数据源的方式呢?

失败方案1:从GridView控件的DataSource属性着手

开始我想能不能从控件的DataSource属性重新获取数据集,经过测试后发现,一旦绑定数据,则DataSource属性就空了。

失败方案2:使用静态类存储数据集

静态类可以存储需要的数据集,且不主动释放就能够一直存在。不过经过测试,静态类和静态数据类似Application,是全应用共享的,多用户使用同一份数据,造成了混乱。

不失败但是也不算成功的方案3:使用动态类保存数据集

静态类不行只能使用动态类了。每次获取新数据集实例化并绑定时,使用一个全局的变量指向这个数据集,可以符合要求。在不更改数据时,可以使用变量指向的实例进行重新绑定。这样实例一直存在可以一直使用,当数据更新时重新实例化并且变量指向新的就可以。

但是这样做有个问题,就是每多一个需要保存的数据集(可能是控件增加、或一些暂存的查询状态等),都需要增加一个全局变量。在实际应用中不方便。

不失败但是也不满足需求的方案4:使用全局ArrayList动态添加指针

在上一个方案的基础上,将全局变量改成ArrayList,就可以动态的添加指针了。但是使用过程中容易引起混乱,经常搞错哪个指针对应哪个数据集……

已经勉强能使用的方案5:使用Session保存指针

Session可以保存键值对,查找就会方便很多,基本算是已经符合要求了。不过Session的生存周期太长了,如果应用中多个页面都需要进行类似操作,就会造成Session的规模越来越大。而手动释放Session的时机和释放对象却不好把握,所以这个方案算是勉强能使用。

上一个方案的扩展方案6:使用ViewState

初学ASP.net时候,绕不过七大对象,分别是Page、Request、Response、Session、Application、Server、Cookie,而ViewState可以说是ASP.net的第八大对象了。

什么是ViewState

ViewState到底是什么?其实ViewState用于维护页面的UI状态Web本身是没有状态的,ASP.NET页面也没有状态,它们在到服务器的每个往返过程中被实例化、执行、呈现和处理。开发人员可以使用一些技术(如以会话状态将状态存储在服务器上,或将页面回传到自身)来添加状态。

例如一个页面进行提交,数据回传到服务器经过处理后,将结果页面发至客户端的过程:

窗体记录了输入的各有效值信息,这是因为HTML窗体元素会在HTTP标头中将其当前值从浏览器发送到服务器,可以使用ASP.NET跟踪来查看回传的窗体值。在ASP.NET之前,开发人员不得不通过多次回传,从HTTP窗体中提取回传值,添加到窗体字段中。现在ASP.NET可以自动完成这项任务。

ViewState是ASP.NET的一种机制,用来跟踪服务器控件的状态值,否则这些值将不作为HTTP窗体的一部分回传。例如Label控件显示的文本默认情况下就保存在ViewState中。如果没有ViewState,像Label控件这类的值就无法自动回传。在开发中,ViewState可以绑定数据,或者在首次加载页面时对Label编程设置一次,ViewState就记录下其状态。以后该控件的值将自动从ViewState中填充,而不用再进行编程设置。因此,除了可以减少工作和代码,ViewState通常还可以减少数据库的往返次数。

ViewState的工作原理

ViewState是由ASP.NET页面框架管理的一个隐藏的窗体字段。当ASP.NET执行某个页面时,该页面上的ViewState值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段(即<input type=hidden>)__VIEWSTATE的值属性,由于隐藏窗体字段是发送到客户端的页面的一部分,所以ViewState值被临时存储在客户端的浏览器中。如果客户端将该页面传回服务器,则ViewState字符串也将被回传。回传后,ASP.NET页面框架将解析ViewState字符串,填充到该页面和各控件。

使用ViewState需要注意的问题

  • 如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 (<form
    runat=server>)。窗体字段是必需的,这样包含 ViewState信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET页面框架才能添加隐藏的字段。
  • 页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState中看到少量的剩余字节。
  • 在页面不回传的情况下,可以通过省略服务器端的 标记来去除页面中的 ViewState

如何使用ViewState

ViewState 为跨回传跟踪控件的状态提供了一条神奇的途径,因为它不使用服务器资源、不会超时,并且适用于任何浏览器。ViewState使用的编程语法于SessionCache语法类似,均是以键值对形式存储。因为ViewState存储信息是格式化成编码字符串,所以调用时需指定数据的类型。

	ViewState("name") = "Hanmeimei"		'保存在ViewState中
	Dim name As String = CStr(ViewState
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值