次のように、コントローラーとビューのセッションデータにアクセスできます。
Session["SessionKey1"]
コントローラまたはビュー以外のクラスからセッション値にどのようにアクセスしますか?
依存関係注入を使用して、HttpContextのインスタンス(またはセッションのみ)を、セッションへのアクセスが必要なクラスに渡します。もう1つの方法は、HttpContext.Currentを参照することですが、静的オブジェクトであるため、テストが難しくなります。
public ActionResult MyAction()
{
var foo = new Foo( this.HttpContext );
...
}
public class Foo
{
private HttpContextBase Context { get; set; }
public Foo( HttpContextBase context )
{
this.Context = context;
}
public void Bar()
{
var value = this.Context.Session["barKey"];
...
}
}
次のようにHttpContext
を介して呼び出すだけです。
HttpContext.Current.Session["MyValue"] = "Something";
これがこの問題の解決策の私のバージョンです。依存性注入も使用していることに注意してください。唯一の大きな違いは、「セッション」オブジェクトがシングルトンを通じてアクセスされることです。
private iSession _Session;
private iSession InternalSession
{
get
{
if (_Session == null)
{
_Session = new SessionDecorator(this.Session);
}
return _Session;
}
}
以下は、Decoratorパターンを使用してセッションをインターフェースにラップするSessionDecoratorクラスです。
public class SessionDecorator : iSession
{
private HttpSessionStateBase _Session;
private const string SESSIONKEY1= "SESSIONKEY1";
private const string SESSIONKEY2= "SESSIONKEY2";
public SessionDecorator(HttpSessionStateBase session)
{
_Session = session;
}
int iSession.AValue
{
get
{
return _Session[SESSIONKEY1] == null ? 1 : Convert.ToInt32(_Session[SESSIONKEY1]);
}
set
{
_Session[SESSIONKEY1] = value;
}
}
int iSession.AnotherValue
{
get
{
return _Session[SESSIONKEY2] == null ? 0 : Convert.ToInt32(_Session[SESSIONKEY2]);
}
set
{
_Session[SESSIONKEY2] = value;
}
}
}`
お役に立てれば :)
また、すべてのセッション変数を1つのクラスファイルにラップします。そうすることで、intelliSenseを使用してそれらを選択できます。これにより、セッションの「文字列」を指定する必要があるコードのペースの数が削減されます。
自分で行ったわけではありませんが、Chad Meyerのブログのこのサンプルが役立つかもしれません(この投稿から: http://www.chadmyers.com/Blog/archive/2007/11/30/asp.net-webforms -and-mvc-in-the-same-project.aspx )
[ControllerAction]
public void Edit(int id)
{
IHttpSessionState session = HttpContext.Session;
if (session["LoggedIn"] == null || ((bool)session["LoggedIn"] != true))
RenderView("NotLoggedIn");
Product p = SomeFancyDataAccess.GetProductByID(id);
RenderView("Edit", p);
}