在C#中确定会话变量的最佳方法是null还是empty?

时间:2008-10-24 19:33:00

标签: c# asp.net session

检查ASP.NET C#中是否存在会话变量的最佳方法是什么?

我喜欢将String.IsNullOrEmpty用于字符串,并想知道Session是否有类似的方法。目前我所知道的唯一方法是:

 var sSession;
 if (Session["variable"] != null)
 {
     sSession = Session["variable"].ToString();
 }
 else
 {
     sSession = "set this";
     Session["variable"] = sSession;
 }

12 个答案:

答案 0 :(得分:111)

继续其他人所说的话。我倾向于有两层:

核心层。这是一个添加到几乎所有Web应用程序项目的DLL 。在这里我有一个SessionVars类,它为Session状态getter / setter做了笨拙的工作。它包含如下代码:

public class SessionVar
{
    static HttpSessionState Session
    {
        get
        {
            if (HttpContext.Current == null)
                throw new ApplicationException("No Http Context, No Session to Get!");

            return HttpContext.Current.Session;
        }
    }

    public static T Get<T>(string key)
    {
        if (Session[key] == null)
            return default(T);
        else
            return (T)Session[key];
    }

    public static void Set<T>(string key, T value)
    {
        Session[key] = value;
    }
}

请注意获取任何类型的泛型。

然后我还为特定类型添加了Getters / Setter,特别是字符串,因为我经常更喜欢使用string.Empty而不是null来呈现给用户的变量。

e.g:

public static string GetString(string key)
{
    string s = Get<string>(key);
    return s == null ? string.Empty : s;
}

public static void SetString(string key, string value)
{
    Set<string>(key, value);
}

等等......

然后我创建了包装器以将其抽象出来并将其引入应用程序模型。例如,如果我们有客户详细信息:

public class CustomerInfo
{
    public string Name
    {
        get
        {
            return SessionVar.GetString("CustomerInfo_Name");
        }
        set
        {
            SessionVar.SetString("CustomerInfo_Name", value);
        }
    }
}

你明白了吗? :)

注意:在为接受的答案添加评论时只是想一想。使用状态服务器时,始终确保将对象存储在Session中时可以序列化。在Web场上尝试使用泛型保存对象并且它会变得繁荣,这很容易。我在工作中部署在Web服务器场上,因此在核心层中添加了对我的代码的检查,以查看该对象是否可序列化,封装Session Getters和Setter的另一个好处是:)

答案 1 :(得分:17)

这就是你如何做到的。但是,您可以使用更短的语法。

sSession = (string)Session["variable"] ?? "set this";

这就是说如果会话变量为null,则将sSession设置为“set this”

答案 2 :(得分:14)

将它包装在一个属性中可能会使事情更加优雅。

string MySessionVar
{
   get{
      return Session["MySessionVar"] ?? String.Empty;
   }
   set{
      Session["MySessionVar"] = value;
   }
}

然后你可以将它视为一个字符串。

if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}

答案 3 :(得分:8)

c#3.0中的'as'符号非常干净。由于所有会话变量都是可空对象,因此您可以获取该值并将其放入您自己的类型变量中,而无需担心抛出异常。大多数对象都可以这样处理。

string mySessionVar = Session["mySessionVar"] as string;

我的概念是你应该将Session变量拉入局部变量,然后适当地处理它们。始终假设您的Session变量可以为null,并且永远不会将它们转换为非可空类型。

如果你需要一个不可为空的类型变量,你可以使用TryParse来获得它。

int mySessionInt;
if (!int.TryParse(mySessionVar, out mySessionInt)){
   // handle the case where your session variable did not parse into the expected type 
   // e.g. mySessionInt = 0;
}

答案 4 :(得分:2)

在我看来,最简单易懂的方法是:

 String sVar = (string)(Session["SessionVariable"] ?? "Default Value");

它可能不是最有效的方法,因为即使在默认情况下(将字符串转换为字符串),它也会转换默认字符串值,但如果您将其作为标准编码实践,则会发现它适用于所有数据类型,易于阅读。

例如(一个完全虚假的例子,但它显示了这一点):

 DateTime sDateVar = (datetime)(Session["DateValue"] ?? "2010-01-01");
 Int NextYear = sDateVar.Year + 1;
 String Message = "The Procrastinators Club will open it's doors Jan. 1st, " +
                  (string)(Session["OpeningDate"] ?? NextYear);

我喜欢Generics选项,但它似乎有点矫枉过正,除非你期望在整个地方都需要它。可以修改extensions方法以专门扩展Session对象,使其具有“安全”获取选项,如Session.StringIfNull(“SessionVar”)和Session [“SessionVar”] =“myval”;它打破了通过Session [“SessionVar”]访问变量的简单性,但它是干净的代码,并且仍然允许验证是否为null或者如果需要则验证字符串。

答案 5 :(得分:1)

检查没有/ Null是这样做的方法。

处理对象类型不是最佳选择。声明一个严格类型并尝试将对象强制转换为正确的类型。 (并使用强制提示或转换)

 private const string SESSION_VAR = "myString";
 string sSession;
 if (Session[SESSION_VAR] != null)
 {
     sSession = (string)Session[SESSION_VAR];
 }
 else
 {
     sSession = "set this";
     Session[SESSION_VAR] = sSession;
 }

对于任何违反语法的行为,我很抱歉,我是每天的VB'er

答案 6 :(得分:1)

通常,我会为会话中的项目创建具有强类型属性的SessionProxy。访问这些属性的代码检查是否为null,并将转换为正确的类型。关于这一点的好处是我所有与会话相关的项目都保存在一个地方。我不必担心在代码的不同部分使用不同的键(并想知道为什么它不起作用)。通过依赖注入和模拟,我可以使用单元测试对其进行全面测试。如果遵循DRY原则,也允许我定义合理的默认值。

public class SessionProxy
{
    private HttpSessionState session; // use dependency injection for testability
    public SessionProxy( HttpSessionState session )
    {
       this.session = session;  //might need to throw an exception here if session is null
    }

    public DateTime LastUpdate
    {
       get { return this.session["LastUpdate"] != null
                         ? (DateTime)this.session["LastUpdate"] 
                         : DateTime.MinValue; }
       set { this.session["LastUpdate"] = value; }
    }

    public string UserLastName
    {
       get { return (string)this.session["UserLastName"]; }
       set { this.session["UserLastName"] = value; }
    }
}

答案 7 :(得分:1)

我也喜欢在属性中包装会话变量。这里的setter是微不足道的,但我喜欢编写get方法,因此它们只有一个出口点。为此,我通常检查null并在返回会话变量的值之前将其设置为默认值。 像这样:

string Name
{
   get 
   {
       if(Session["Name"] == Null)
           Session["Name"] = "Default value";
       return (string)Session["Name"];
   }
   set { Session["Name"] = value; }
}

}

答案 8 :(得分:1)

此方法也不假设Session变量中的对象是字符串

if((Session["MySessionVariable"] ?? "").ToString() != "")
    //More code for the Code God

所以基本上用空字符串替换null变量,然后将其转换为字符串,因为ToStringObject类的一部分

答案 9 :(得分:0)

您使用的是.NET 3.5吗?创建一个IsNull扩展方法:

public static bool IsNull(this object input)
{
    input == null ? return true : return false;
}

public void Main()
{
   object x = new object();
   if(x.IsNull)
   {
      //do your thing
   }
}

答案 10 :(得分:0)

如果你知道它是一个字符串,你可以使用String.IsEmptyOrNull()函数。

答案 11 :(得分:0)

以这种方式可以检查这样的密钥是否可用

if (Session.Dictionary.ContainsKey("Sessionkey"))  --> return Bool