ASP.NET C#でセッション変数の存在を確認する最良の方法は何ですか?
String.IsNullOrEmpty
を文字列に使用するのが好きで、Session
にも同様の方法があるかどうか疑問に思いました。現在、私が知っている唯一の方法は:
var sSession;
if (Session["variable"] != null)
{
sSession = Session["variable"].ToString();
}
else
{
sSession = "set this";
Session["variable"] = sSession;
}
他の人が言ったことをフォローする。私は2つの層を持つ傾向があります:
コアレイヤー。これはDLLこれはほぼすべてのWebアプリプロジェクトに追加されます内にあります。ゲッター/セッター:次のようなコードが含まれています。
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;
}
}
任意の型を取得するためのジェネリックに注意してください。
次に、特定のタイプ、特に文字列のゲッター/セッターも追加します。これは、ユーザーに提示される変数に対してnullではなくstring.Emptyを使用することが多いためです。
例えば:
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);
}
}
}
アイデアは正しいですか? :)
注:受け入れられた回答にコメントを追加するときに考えただけです。状態サーバーを使用する場合、セッションにオブジェクトを保存するときは、常にオブジェクトがシリアル化可能であることを確認してください。 Webファーム上でジェネリックを使用してオブジェクトを保存しようとすると、非常に簡単になり、ブームになります。職場のWebファームにデプロイするため、コアレイヤーのコードにチェックを追加して、オブジェクトがシリアル化可能かどうかを確認します。これは、セッションゲッターとセッターをカプセル化するもう1つの利点です。
それがあなたのやり方です。ただし、使用できる短い構文があります。
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」表記は非常に簡潔です。すべてのセッション変数はNULL可能オブジェクトであるため、これにより値を取得し、例外をスローする心配なしに独自の型付き変数に入れることができます。ほとんどのオブジェクトはこの方法で処理できます。
string mySessionVar = Session["mySessionVar"] as string;
私のコンセプトは、セッション変数をローカル変数にプルし、適切に処理することです。 Session変数はnullである可能性があり、null不可の型にキャストしないことを常に想定してください。
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;
}
私の意見では、これを行う最も簡単で明確で読みやすい方法は次のとおりです。
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);
私はジェネリックのオプションが好きですが、これをあちこちで必要としない限り、やり過ぎのようです。拡張メソッドは、Session.StringIfNull( "SessionVar")およびSession ["SessionVar"] = "myval";のような「安全な」getオプションを持つように、特にSessionオブジェクトを拡張するように変更できます。 Session ["SessionVar"]を介して変数にアクセスするという単純さを破りますが、クリーンなコードであり、必要であればnullまたはstringを検証できます。
セッション変数をプロパティでラップすることも好きです。ここのセッターは簡単ですが、出口メソッドが1つだけになるようにgetメソッドを記述するのが好きです。そのためには、通常、セッション変数の値を返す前にnullをチェックしてデフォルト値に設定します。このようなもの:
string Name
{
get
{
if(Session["Name"] == Null)
Session["Name"] = "Default value";
return (string)Session["Name"];
}
set { Session["Name"] = value; }
}
}
このメソッドは、Session変数のオブジェクトが文字列であることも想定していません
if((Session["MySessionVariable"] ?? "").ToString() != "")
//More code for the Code God
ToString
はObject
クラスの一部であるため、基本的にnull変数を空の文字列に置き換えてから文字列に変換します。
通常、セッション内の項目の厳密に型指定されたプロパティでSessionProxyを作成します。これらのプロパティにアクセスするコードはnullityをチェックし、適切な型にキャストします。これのいいところは、セッション関連のアイテムがすべて1か所に保管されていることです。コードのさまざまな部分でさまざまなキーを使用することを心配する必要はありません(そして、なぜ機能しないのか不思議に思っています)。そして、依存性注入とモックを使用して、単体テストで完全にテストできます。 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; }
}
}
何もしない/ 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です
.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
}
}
文字列であることがわかっている場合は、String.IsEmptyOrNull()関数を使用できます。
このようにして、そのようなキーが利用可能かどうかを確認できます
if (Session.Dictionary.ContainsKey("Sessionkey")) --> return Bool