Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 全局变量与ASP.NET会话状态_C#_.net_Asp.net_Session_Global - Fatal编程技术网

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

C# 全局变量与ASP.NET会话状态,c#,.net,asp.net,session,global,C#,.net,Asp.net,Session,Global,这听起来可能很幼稚,但我正在开发一个跨多个页面的web应用程序。所有这些页面都实例化了使用API访问CMS的同一类对象和方法。当前,当用户开始创建内容时,我将存储变量,如文件夹ID,其中内容位于会话变量中 我的问题是:我能否实例化一个类的单个实例,该实例可以在所有页面上使用,而不必在每个页面上都这样做?如果是这样的话,每个访问该页面的人都会得到他们自己版本的类吗?我认为使用静态变量和方法不是一种好办法,因为它们在内存中共享。此外,如果要在.net C#应用程序的Web应用程序中全局使用某个对象,

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


我的问题是:我能否实例化一个类的单个实例,该实例可以在所有页面上使用,而不必在每个页面上都这样做?如果是这样的话,每个访问该页面的人都会得到他们自己版本的类吗?我认为使用静态变量和方法不是一种好办法,因为它们在内存中共享。此外,如果要在.net C#应用程序的Web应用程序中全局使用某个对象,则在何处/如何声明该对象?

如果要存储仅针对当前用户的信息,则应使用state

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

SomeType someValue = ...
Session["someKey"] = someValue;
SomeType someValue = (SomeType)Session["someKey"];
然后稍后在另一页从会话中检索它:

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

你要找的图案很简单。有两种方法可以实现它

  • 创建一个对象并将其存储在会话中
  • 创建一个由多个部分组成的表单,并将项目保留在viewstate中

  • 每个都有其优点。

    我建议创建一个从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。您将可以访问任何属性


    这使得后面的代码简洁明了。

    这样做并在网站上使用全局over sessions的缺点很简单,即任何访问该网站的用户都可以访问全局变量,而不必考虑会话。以下面的代码为例

       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";
        }
    

    现在,您将在页面的每一个表单上看到这一点,但这一点的缺点是,访问您的页面的任何其他人也将能够看到这些数据。如果它的数据需要在多个会话中共享,您可以这样做。如果当前用户只需要在多个类上共享其数据,则需要使用会话变量

    我个人喜欢这个答案,它非常干净。我要用它。谢谢@Bill Martin-会话[“FooSessionObject”]的空检查是否应该不在get语句中?获取{if(Session[“FooSessionObject”]==null){//实例化一个新的会话[“FooSessionObject”]=new Foo();}返回(Foo)会话[“FooSessionObject”];有人问了一个类似的问题,我认为这几乎概括了您的所有选择。可能重复的“还有,如果某个东西要在.net C#应用程序的Web应用程序中全局使用,它在哪里/如何声明?”您可能想澄清一下这个问题。您当然可以在特定程序集中定义类,并在构建ASP.NET网站、Web服务、控制台应用程序等时引用该程序集。但是,如果您需要不同的应用程序来共享类的特定实例,那么您可能需要研究.NET远程处理或类似技术技术。