asp.net中静态变量的应用
来源:互联网 发布:java绘制动态图形 编辑:程序博客网 时间:2024/05/17 19:19
现在转入了BS软件开发,我们很自然地会沿用这种习惯。如在页面中统计某个按钮被按下的次数,先在类中OnClick事件的处理过程前定义一static变量times,则每次调用该按钮的OnClick事件时,令times增1即可,非常方便:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Btn_Add_Click(object sender, EventArgs e)
{
times++;
Label1.Text = times.ToString();
}
这还要从Asp.net的运行机制谈起。在CS模式软件开发过程中,我们通常不会关心应用程序是在哪里运行的,变量存放在哪里,客户端程序就运行在客户端,服务器端程序就运行在服务器端,一般情况下,二者除了数据库中的数据外基本没有其他共享的东西。所以这时客户端的用户大可放心的使用static变量,因为它们就存放在客户端程序中。
于是我们就习惯的在做BS模式的页面时也用static变量,殊不知Asp.net中的static已不同于CS中的static。原因很简单,就是因为在Asp.net中所有的用户将使用同一个static变量。这就意味着每一个使用该页面的用户对该变量的操作将会影响到其他用户。就拿上面计数器的例子来说,假设times初试值为0,因为此时只有我们自己在使用这个页面,当然不会有什么问题,但如果有两个人同时连接到这个页面,如果A单击了Button1一次,则B刷新页面后Label1将显示1,如果B再单击Button1一次,则times变成2,两个人刷新页面后就出现问题了:A和B都会说,我明明只单击了Button1一次,怎么Label1就显示我单击了两次哪?——这就是因为两个人共用的是服务器上同一个times,任何一个人对times的操作都会在使用该页面的他人的浏览器中表现出来。问题就出在这里。
怎么办哪?还好,除了传统的Asp中的Session对象外,Asp.net提供了一个更好的ViewState对象。ViewState对象用来保存页面中的各种变量,甚至是对象。使用方法和HashTable类似,只要用变量名称做索引,如ViewState["Var"],就可以用存取变量Var的值,而不管Var是普通变量,还是对象,甚至是内存中的一张DataTable,太方便了。为什么可以用ViewState而不能用static变量哪?原因就是服务器端会为每个连接到该页面的用户分别建立一个ViewState,所以ViewState相当于页面级的Session。这下我们可以放心地使用ViewState来存取需要暂寸的变量和对象了。
ViewState的用法很简单,如下所示:
1、保存变量到ViewState中:
ViewState["times"]=times;//存放普通变量times
ViewState["Orders"]=dtOrders;//存放DataTable型对象dtOrders
2、读出ViewState中的值:
times=(int)ViewState["times"];
dtOrders=(DataTable)ViewState["Orders"];
看见了吧?就如此简单!有的朋友会问读出变量的值时为什么要进行强制类型转换?这是因为当变量(不管是int型的普通变量times,还是DataTable型的对象dtOrders)被存放到ViewState中后,ViewState可不管你是普通变量还是对象,统统按Object来对待。所以当我们取出存放在ViewState中的东西时,一定要转换成相应的类型,否则就会报错。而这一操作不用在用ViewState保存变量时进行,系统会自动转换。(注意ViewState括号中的字符串只是为了标识不同变量的索引,用不着非要和变量同名)所以上面计数器的代码应该这样写才好:
{
if (!Page.IsPostBack)
{
ViewState["times"] = 0;
}
}
protected void Btn_Add_Click(object sender, EventArgs e)
{
int times=(int)ViewState["times"];
times++;
ViewState["times"]=times;
Label1.Text = times.ToString();
}
还有一点需要注意:如果在页面中多个过程要共享一个对象或变量,我们在页面类的开始部分定义一个页面级的全局变量是不行的,static本来可以,但上面说了这种类型的变量不安全,所以这时就可以用ViewState。
好了,这下我们可以放心的暂存某些变量或对象了。
但在随后的实践中我发现,在页面中还是尽量少用ViewState变量,因为ViewState变量在客户端实际上是用<input type="hidden" value="ADFAIB3P234P-AFAFAF......"/>保存的一个对象,这样如果要保存的是个对象,甚至是个很复杂的对象(如DataTable),这样以来就会增加网络传输的负担。
注意:页面的多次重新加载,ViewState["times"]值不能保存
如:
ches.aspx
ches.aspx?page=1
ches.aspx?page=1&lb=2
推荐文章:
在ASP.net中,静态变量的生命周期是从服务器程序启动-到服务器程序关闭或被回收,而与你是否打开、关闭网页时无关的
- asp.net中静态变量的应用
- asp.net中静态变量的使用。
- asp.net中使用静态变量
- asp.net中静态变量和非静态变量的区别
- ASP.NET的静态变量,请慎用
- asp.net中关于静态变量的生命周期和线程安全
- asp.net 静态变量 、局变量
- asp.net中TabContainer的静态使用方法
- 静态变量的应用
- asp.net 中的静态变量 (小知识)
- asp.net forums中定时器的应用
- asp.net forums中定时器的应用
- ASP.net中Datagrid的应用
- Asp.net 中CheckBoxList 的应用
- ASP.NET中NHibernate的应用
- ASP.NET中控件应用的思考
- asp.net forums中定时器的应用
- asp.net 中cookie 的应用
- js为元素动态添加css代码
- 配置文件中appSetting和connectionStrings
- 如何在Windows XP中重新安装或修复IE6
- android 把TextView中的文字添加阴影效果
- BMP文件结构
- asp.net中静态变量的应用
- 关于开源授权协议 GPL 和 LGPL
- c++位操作详解
- 逆波兰式--利用栈实现
- ASP.NET页面同时存在自定义控件,母版页,内容页的加载顺序
- 突破伪静态的四种注入方法
- FlashFxp中文乱码解决
- 盘点2011年度四大艳照门事件
- 双缓冲为什么应该这样用?