79

ASP.NET C# でセッション変数の存在を確認する最良の方法は何ですか?

文字列に Worksを使用するのが好きString.IsNullOrEmpty()で、同様の方法があるかどうか疑問に思いましたSession。現在、私が知っている唯一の方法は次のとおりです。

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

12 に答える 12

115

他の人が言ったことに従うこと。私は2つの層を持つ傾向があります:

コア層。これは、ほぼすべての Web アプリ プロジェクトに追加される DLL 内にあります。これには、セッション状態のゲッター/セッターの面倒な作業を行う SessionVars クラスがあります。次のようなコードが含まれています。

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;
    }
}

任意の型を取得するためのジェネリックに注意してください。

次に、特定の型、特に文字列の Getter/Setter も追加します。これは、ユーザーに提示される変数に対して、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);
        }
    }
}

あなたはその考えを正しく理解していますか?:)

注:受け入れられた回答にコメントを追加するときに考えました。状態サーバーを使用する場合は、オブジェクトを Session に格納するときに、オブジェクトがシリアライズ可能であることを常に確認してください。Web ファームでジェネリクスを使用してオブジェクトを保存しようとするのは非常に簡単で、ブームになっています。私は職場の Web ファームにデプロイするため、コア レイヤーのコードにチェックを追加して、オブジェクトがシリアライズ可能かどうかを確認しました。これは、セッション ゲッターとセッターをカプセル化するもう 1 つの利点です :)

于 2008-10-24T20:25:41.873 に答える
18

それはあなたがそれを行う方法です。ただし、使用できる短い構文があります。

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

これは、セッション変数が null の場合、sSession を「set this」に設定すると言っています。

于 2008-10-24T19:37:44.047 に答える
14

プロパティでラップすると、物事がよりエレガントになる場合があります。

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

その後、文字列として扱うことができます。

if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}
于 2008-10-24T19:59:42.007 に答える
8

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;
}
于 2008-10-24T21:00:24.487 に答える
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 オプションが気に入っていますが、これがあちこちで必要になると思わない限り、やり過ぎのように思えます。拡張メソッドを変更して、Session オブジェクトを具体的に拡張し、Session.StringIfNull("SessionVar") や Session["SessionVar"] = "myval"; のような「安全な」取得オプションを持たせることができます。これは、Session["SessionVar"] を介して変数にアクセスする単純さを破りますが、クリーンなコードであり、必要に応じて null または文字列の場合でも検証できます。

于 2011-08-23T01:30:45.583 に答える
2

このメソッドは、Session 変数のオブジェクトが文字列であることも想定していません。

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

したがって、クラスToStringの一部であるため、基本的にnull変数を文字列に変換する前に空の文字列に置き換えますObject

于 2016-05-17T13:35:35.780 に答える
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 です。

于 2008-10-24T19:39:09.597 に答える
1

また、セッション変数をプロパティでラップするのも好きです。ここでのセッターは些細なことですが、私は get メソッドを書くのが好きで、出口点が 1 つだけになるようにします。これを行うには、通常、セッション変数の値を返す前に、null をチェックしてデフォルト値に設定します。このようなもの:

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

}

于 2008-10-25T07:26:05.833 に答える
1

通常、セッション内のアイテムの厳密に型指定されたプロパティを使用して SessionProxy を作成します。これらのプロパティにアクセスするコードは、null 性をチェックし、適切な型にキャストします。これの良いところは、セッションに関連するすべてのアイテムが 1 か所にまとめられていることです。コードのさまざまな部分でさまざまなキーを使用することを心配する必要はありません (そして、なぜそれが機能しないのか疑問に思います)。また、依存性注入とモックを使用すると、単体テストで完全にテストできます。If は 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; }
    }
}
于 2008-10-24T20:23:24.547 に答える
1

このようにして、そのようなキーが利用可能かどうかを確認できます

if (Session.Dictionary.ContainsKey("Sessionkey"))  --> return Bool
于 2018-10-08T12:38:54.253 に答える
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
   }
}
于 2008-10-24T19:47:56.507 に答える
0

文字列であることがわかっている場合は、String.IsEmptyOrNull() 関数を使用できます。

于 2008-10-24T19:51:42.677 に答える