在ASP.NET C#中检查会话变量是否存在的最佳方法是什么?
我喜欢使用String.IsNullOrEmpty
字符串的作品,并想知道是否有类似的方法Session
.目前我所知道的唯一方法是:
var sSession; if (Session["variable"] != null) { sSession = Session["variable"].ToString(); } else { sSession = "set this"; Session["variable"] = sSession; }
Rob Cooper.. 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(string key) { if (Session[key] == null) return default(T); else return (T)Session[key]; } public static void Set (string key, T value) { Session[key] = value; } }
请注意获取任何类型的泛型.
然后我还为特定类型添加Getters/Setter,特别是字符串,因为我经常更喜欢使用string.Empty而不是null来呈现给用户的变量.
例如:
public static string GetString(string key) { string s = Get(key); return s == null ? string.Empty : s; } public static void SetString(string key, string value) { Set (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和Setters的另一个好处:)
继续其他人所说的话.我倾向于有两层:
核心层.这是在几乎所有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(string key) { if (Session[key] == null) return default(T); else return (T)Session[key]; } public static void Set (string key, T value) { Session[key] = value; } }
请注意获取任何类型的泛型.
然后我还为特定类型添加Getters/Setter,特别是字符串,因为我经常更喜欢使用string.Empty而不是null来呈现给用户的变量.
例如:
public static string GetString(string key) { string s = Get(key); return s == null ? string.Empty : s; } public static void SetString(string key, string value) { Set (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和Setters的另一个好处:)
这就是你如何做到的.但是,您可以使用更短的语法.
sSession = (string)Session["variable"] ?? "set this";
这是说如果会话变量为null,则将sSession设置为"set this"
将它包装在属性中可能会使事情变得更加优雅.
string MySessionVar { get{ return Session["MySessionVar"] ?? String.Empty; } set{ Session["MySessionVar"] = value; } }
然后你可以把它当作一个字符串.
if( String.IsNullOrEmpty( MySessionVar ) ) { // do something }
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; }