asp.net如何在页面中设置全局变量?如果你想使用全局变量,可以有很多方法:Session,Cache,静态成员等等。
但是这些方法的变量生命周期都是基于会话或大于会话的,那么如何仅在一个页面周期中使用全局变量呢?
固然你可以增加一些逻辑来继续使用这些方法,但是对于Session和Cache,无谓增加了服务器端的负担;对于静态成员,则没法保证多线程访问时的一致性。
那么如何解决?方案如下:
我们知道,对于每一次的页面请求,都会生成一个当前Http上下文的实例,通过System.Web.HttpContext.Current来提供,这个对象是HttpContext的实例。
包含了当前的Request,Response,Session对象。这些对象极大方便了在单独的类文件中访问当前请求的常用信息。
那么,除了Request,Response,Session之外,你想自定义一个这样的对象,如何实现呢?答案还在HttpContext中,
实际上HttpContext还提供了一个Items属性,它是一个IDictionary的实例,你可以在其中存储任何名/值对,并且在页面周期结束之后,这些值自动消失。
通过这个字典集合属性,我们就能够在其中存储任何的仅存活于当前请求的全局变量。
应用场景举例:
一个页面中的多个类都用到数据库 ,那么需要创建连接。如果你只想创建一次连接,而被所有类公用。那么通常的做法,需要把这个数据库连接作为参数传递到各个类的构造函数。增加了不必要的麻烦。
有了上述方案,假设我们有自定义的一个Connection类:MyConnection,这时,可以学习HttpContext,定义一个静态属性Current,来获取一个实例,并且避免重复创建:
Class MyConnection
{
public static MyConnection Current
{
if(System.Web.HttpContext.Current.Items["myConnection"] == null)System.Web.HttpContext.Current.Items["myConnection"] = new MyConnection();
return (MyConnection)System.Web.HttpContext.Current.Items["myConnection"];
}
}