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

cra*_*ver 77 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;
 }
Run Code Online (Sandbox Code Playgroud)

Rob*_*per 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

例如:

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);
}
Run Code Online (Sandbox Code Playgroud)

等等...

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

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

你明白了吗?:)

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


Ely*_*Ely 17

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

sSession = (string)Session["variable"] ?? "set this";
Run Code Online (Sandbox Code Playgroud)

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


Gre*_*gle 14

将它包装在属性中可能会使事情变得更加优雅.

string MySessionVar
{
   get{
      return Session["MySessionVar"] ?? String.Empty;
   }
   set{
      Session["MySessionVar"] = value;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以把它当作一个字符串.

if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}
Run Code Online (Sandbox Code Playgroud)


Aar*_*mer 8

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

string mySessionVar = Session["mySessionVar"] as string;
Run Code Online (Sandbox Code Playgroud)

我的概念是你应该将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;
}
Run Code Online (Sandbox Code Playgroud)