尝试使用会话变量,询问给定的Session变量是否为null

时间:2012-12-16 19:54:27

标签: c# asp.net session-variables code-design

因为情况在底部描述(使用Webworms而不是Mvc),

因为我可能需要“掌握”Session变量的实现,几乎在每个Web应用程序中,我都构建了一个专用的类,可以帮助我轻松地管理它。

方法如下

这个第一个代码块供用,您可以在下一个代码块中看到它正在调用的类

我故意使用拼写错误的名字,以避免歧义(没有任何前缀),...所以我可以通过这种方式更容易地发现它。

 
//'importing' the class for current project
using SeSn = Debug_Tests.Seseions.SeSn;

// creating an object (usually with name related to currentProject)
public static SeSn.CreatCurrentSesionVariablsStructNamed CurSesVarStruct = new Seseions.SeSn.CreatCurrentSesionVariablsStructNamed();

// the long name helps me in this little 'chaos'

到目前为止,这是struct的一个实例,即将所有globals“捆绑”或“绑定”为一个捆绑包,

因此,当我需要存储我的全局变量时,我会将值分配给适当的结构变量CurSesVarStruct必须提供。

然后,我只需要访问会话变量一次,只提取“变量集合” - object,...因为它实际上是一个会话变量,我保持它的名称不变 - _CurrentSesionGlobals

我尽力描述背景,但简而言之:

它是作为会话变量之一存储在会话中的结构 - 数据类型= object 或者你可以说要在会话之间保存结构的克隆。

因此要使用_CurrentSesionGlobals,我可以通过它访问我需要的任何值,如下所示:

在将结构存储到Session

之前分配结构  
CurSesVarStruct.SelectedUercustid = custID;

然后下一个方法 - ExtrctSesnVar()允许我使用例如:

提取上次会话中保存的变量:

 
custID = ExtractSesnVar().SelectedUercustid;

所以SelectedUercustid实际上是结构成员之一。

问题

从会话变量中提取_CurrentSesionGlobals

 
public static SeSn.CreatCurrentSesionVariablsStructNamed ExtrctSesnVar()
{
    var CurrAppGlobals = SeSn.GetValueAS.ACloneOfTheStructObj("_CurrentSesionGlobals");
    return (SeSn.CreatCurrentSesionVariablsStructNamed)CurrAppGlobals;
  //the question is refereing this location.
}

问题

如何为null结果

设置返回值

或首先询问我要提取的object /给定Session Variable是不是null,还是不存在的条件?

因为它现在有一个异常错误,而我正在尝试获取非现有会话变量的值....

下一个代码块。

这是我在解决方案中添加的一个类,作为每个网站应用程序的帮助。

它实际上是一个命名空间。 所以负责处理会话变量的类是Sesn

  namespace Seseions
  {
        public class Sesn
        {

            public static bool isNotEmpty()
            {
                return HttpContext.Current.Session.Keys.Count > 0;
            }


            public struct CreatCurrentSesionVariablsStructNamed
            {

                // some of commonly used variables- still testing options..

                public int ManagerCustID;
                public int SelectedUercustid;
                public int recordID;
                public int SelectedMonth;
                public int SelectedChosenWorker;
                public int SelectedYear ;


                public string SelectedTable;
                public string SelectedColumn;
                public string SqlSelectCommandLastQuery;
                public string TableOfUsersReference;
                public List<string> Fontlist { get; set; }

            }

            // converts and extract values of session variables

            public class GetValueAS
            {
                public static CreatCurrentSesionVariablsStructNamed ACloneOfTheStructObj(string currntProjectSesVarStructName)
                {
                    if(HttpContext.Current.Session[currntProjectSesVarStructName] != null)
                    return (CreatCurrentSesionVariablsStructNamed)HttpContext.Current.Session[currntProjectSesVarStructName];

                }

                public static int _Int(string SesParameterValToReturn)
                {
                    return Convert.ToInt32(HttpContext.Current.Session[SesParameterValToReturn]);
                }

                public static string _String(string SesParameterValToReturn)
                {
                    return Convert.ToString(HttpContext.Current.Session[SesParameterValToReturn]);
                }
                public static DataSet _DataSet(string SesParameterValToReturn)
                {
                    return (DataSet)HttpContext.Current.Session[SesParameterValToReturn];
                }
                public static DataTable _DataTable(string SesParameterValToReturn)
                {
                    return (DataTable)HttpContext.Current.Session[SesParameterValToReturn];
                }
                public static bool _Bool(string SeSnVarToCheckOn)
                {
                    if (HttpContext.Current.Session[SeSnVarToCheckOn] == null)
                        return false;
                    return (bool)HttpContext.Current.Session[SeSnVarToCheckOn];
                }



            }

            // an easy way to access and mange session variables actions
      public enum Act
      {
                 Add, Remove, Replace
      }
            public static void Modify(Act action, string New_SesnVarName= null, object NewP_Value=null, string Currnt_Ses_SesnVarName=null)
            {
                switch (action)
                {
                    case Act.Remove:
                        if (isNotEmpty())
                            HttpContext.Current.Session.Remove(CurSes_ParamName);
                        break;
                    case Act.Replace:
                         HttpContext.Current.Session.Remove(CurSes_ParamName);
                         HttpContext.Current.Session.Add(New_SesnVarName, NewP_Value);
                        break;

                    case Act.Add:
                        HttpContext.Current.Session.Add(NewQs_SesnVarName, NewP_Value);
                        break;


                }


            }

        }
    }

1 个答案:

答案 0 :(得分:3)

请不要这样做。

  • critical:不要将Session(用户)相关数据放在静态变量中。它不是线程安全的。
  • 最佳做法:尽量避免使用ASP.NET中的static
  • 最佳做法:不要将struct用于除小型,不可变和无身份类型之外的任何内容

看来你过度设计了这个。你需要的只是(现在)是为字符串使用一些常量:

public static class SessionKeys
{
   public const string ManagerCustID = "ManagerCustID";
   ...
}

然后您就可以开始专注于为您的应用增加价值的代码。