检查ASP.NET C#中是否存在会话变量的最佳方法是什么?
我喜欢将String.IsNullOrEmpty
用于字符串,并想知道Session
是否有类似的方法。目前我所知道的唯一方法是:
var sSession;
if (Session["variable"] != null)
{
sSession = Session["variable"].ToString();
}
else
{
sSession = "set this";
Session["variable"] = sSession;
}
答案 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变量,然后将其转换为字符串,因为ToString
是Object
类的一部分
答案 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