今天在自测时,发现了一个非常”有趣“的问题,被惊出了一身冷汗,幸好发现的及时,搁这么一个炸弹在身边,着实令人心惊胆战。
事情是这样的:在页面上有一个类似于计数器的功能,每点击一次按钮,计数器上的数字相应的增加和减少。在自测试时,计数器突然Out of Control了,老是弹跳着增加减少,顿时郁闷至极。看了一下代码,顿悟,原来是变量Static惹的祸。
在CS开发时,在需要保存处理过的值时,用的最多的就是Static,现在BS开发,首当其冲的就想到了static,没想到给自己埋下了这么一大雷。为什么CS可以,BS就出问题了呢?这得从他们的运行机制来说:
在CS模式软件开发过程中,我们通常不会关心应用程序是在哪里运行的,变量存放在哪里,客户端程序就运行在客户端,服务器端程序就运行在服务器端,一般情况下,二者除了数据库中的数据外基本没有其他共享的东西。所以这时客户端的用户大可放心的使用static变量,因为它们就存放在客户端程序中。但是,在Asp.net中的static已不同于CS中的static。原因很简单,就是因为在Asp.net中所有的用户将使用同一个static变量。这就意味着每一个使用该页面的用户对该变量的操作将会影响到其他用户。就拿计数器的例子来说,假设其初试值为0,因为此时只有我们自己在使用这个页面,当然不会有什么问题,但如果有两个人同时连接到这个页面,如果A单击了增加一次,则B刷新页后显示器将显示1,如果B再单击增加一次,则计数器变成2,两个人刷新页面后就出现问题了:点击一下,计数器有弹跳增加的现象——这就是因为两个人共用的是服务器上同一个static变量,任何一个人对它的的操作都会在使用该页面的他人的浏览器中表现出来。问题就出在这里。
但是,这个我们应该如何解决呢?这时候,ASP.NET的ViewState就登场了,其作用相当于session,既可以保存变量,也可以保存对象。具体用法如下:
1、保存值
ViewState["intTest"]=intTest; //存放普通变量times
ViewState["dtTest"]=dtTest; //存放DataTable型对象dtOrders
2、读出ViewState的值
intTest = (int)ViewState["intTest"];
dtTest = (DataTable)ViewState["dtTest"];
用ViewState传值是非常方便可靠的,既可以传变量,也可以传datatable等,因为它会统一把值当做对象object对待。所以,在我们读取ViewState的值时,一定要对ViewState的类型进行转换,否则,就会报错。