165

アプリケーションのApp_Codeフォルダーにクラスファイルを作成しました。セッション変数があります

Session["loginId"]

クラスでこのセッション変数にアクセスしたいのですが、次の行を書いているとエラーが発生します

Session["loginId"]

ASP.NET 2.0(C#)のapp_codeフォルダーに作成されたクラス内のセッション変数にアクセスする方法を教えてもらえますか?

4

7 に答える 7

373

(完全を期すために更新)を使用して、任意のページまたはコントロールから、および任意のクラス (たとえば、クラス ライブラリ内から)
からセッション変数にアクセスできます。Session["loginId"]System.Web.HttpContext.Current.Session["loginId"].

しかし、私の元の答えを読んでください...


セッション変数へのアクセスを簡素化するために、私は常に ASP.NET セッションの周りにラッパー クラスを使用します。

public class MySession
{
    // private constructor
    private MySession()
    {
      Property1 = "default value";
    }

    // Gets the current session.
    public static MySession Current
    {
      get
      {
        MySession session =
          (MySession)HttpContext.Current.Session["__MySession__"];
        if (session == null)
        {
          session = new MySession();
          HttpContext.Current.Session["__MySession__"] = session;
        }
        return session;
      }
    }

    // **** add your session properties here, e.g like this:
    public string Property1 { get; set; }
    public DateTime MyDate { get; set; }
    public int LoginId { get; set; }
}

このクラスは、ASP.NET セッションにそれ自体の 1 つのインスタンスを格納し、次のように、任意のクラスからタイプ セーフな方法でセッション プロパティにアクセスできるようにします。

int loginId = MySession.Current.LoginId;

string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;

DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;

このアプローチにはいくつかの利点があります。

  • 多くの型キャストからあなたを救います
  • アプリケーション全体でハードコーディングされたセッション キーを使用する必要はありません (例: Session["loginId"]
  • MySession のプロパティに XML ドキュメント コメントを追加することで、セッション アイテムを文書化できます。
  • セッション変数をデフォルト値で初期化できます(たとえば、それらがnullでないことを保証します)
于 2009-03-07T10:10:22.647 に答える
108

スレッドのHttpContextを介してセッションにアクセスします:-

HttpContext.Current.Session["loginId"]
于 2009-03-07T08:50:37.567 に答える
24

提案されたソリューションの問題は、アウトプロセス セッション ストレージを使用している場合、SessionState に組み込まれている一部のパフォーマンス機能が壊れる可能性があることです。(「ステート サーバー モード」または「SQL サーバー モード」のいずれか)。oop モードでは、セッション データをページ リクエストの最後にシリアライズし、ページ リクエストの最初にデシリアライズする必要がありますが、これにはコストがかかる可能性があります。パフォーマンスを向上させるために、SessionState は、最初にアクセスされたときに変数のみを逆シリアル化することによって必要なもののみを逆シリアル化しようとし、変更された変数のみを再シリアル化して置き換えます。多くのセッション変数があり、それらすべてを 1 つのクラスに押し込むと、基本的に、セッションを使用するすべてのページ要求でセッション内のすべてが逆シリアル化され、クラスが変更されたために 1 つのプロパティのみが変更された場合でも、すべてを再度シリアル化する必要があります。大量のセッションと oop モードを使用している場合に考慮すべきことです。

于 2010-06-10T17:42:14.830 に答える
1

カスタム Session クラス内でセッション変数を操作しようとしていたため、同じエラーが発生しました。

現在のコンテキスト (system.web.httpcontext.current) をクラスに渡す必要がありましたが、すべてうまくいきました。

MA

于 2012-02-12T22:47:56.690 に答える