全局变量与ASP.NET会话状态

时间:2011-07-20 20:23:54

标签: c# .net asp.net session global

这可能听起来很天真,但我正在开发一个跨越多个页面的Web应用程序。所有这些页面都使用其API访问CMS的方法实例化相同的类对象。目前,当用户开始创建内容时,我将存储变量,如内容位于Session变量中的文件夹ID。

我的问题是:我可以实例化一个可以跨所有页面使用的类的单个实例,而不必在每个页面上执行吗?如果是这样,访问该页面的每个人都会获得他们自己的课程版本吗?我假设使用静态变量和方法不是可行的方法,因为它们在内存中共享。而且,如果它将在.net C#应用程序中的Web应用程序中全局使用,那么声明在哪里/如何声明?

4 个答案:

答案 0 :(得分:7)

我建议创建一个继承自System.Page的基类。然后让你的页面代码继承自那。

然后,在基类内部创建一个属性,该属性是对象的引用。像这样,例如:

public class BasePage : System.Web.UI.Page
{
    public Foo CurrentFoo
    {
        get
        {
            return (Foo)Session["FooSessionObject"];
        }
        set
        {
            if(Session["FooSessionObject"] == null)
            { 
                // instantiate a new one
                Session["FooSessionObject"] = new Foo();
            }
            Session["FooSessionObject"] = value;
        }
    }
}

然后,从任何页面的任何地方,只需要做一个CurrentFoo。并且您可以访问任何属性。

这使得后面的代码变得干净利落。

答案 1 :(得分:0)

如果要存储仅针对当前用户的信息,则应使用Session状态。

例如,在应用程序的一个页面中,您可以将一些值存储到会话中:

SomeType someValue = ...
Session["someKey"] = someValue;

然后在其他页面上从会话中检索它:

SomeType someValue = (SomeType)Session["someKey"];

答案 2 :(得分:0)

您正在寻找的模式非常简单。有几种方法可以实现它。

  1. 创建一个对象并将其存储在会话
  2. 创建多部分表单并将项目保留在viewstate
  3. 每个都有其好处。

答案 3 :(得分:0)

关于这样做以及对网站使用全局覆盖会话这是一个简单的事实,即任何访问不管会话的用户都可以访问全局变量。例如,请使用下面的代码。

   public class globals
    {
        static string _test = "MyTest";
        public static string test 
        {
            get
             {
                return _test;
             }
            set
             {
                _test = value;
             }
        }

在创建全局类之后,我将标签添加到默认值中,并将全局变量文本分配给标签。

protected void Page_Load(object sender, EventArgs e)
    {
        globals.test = "Some Data";
    }

现在你会在你页面的每个表单上都看到这个,但是对于这个,访问你页面的任何人都可以看到这些数据。如果需要在多个会话中共享其数据,则可以执行此操作。如果其数据只需要当前用户在多个类上共享,则需要使用会话变量。