Мы можем получить доступ к данным сеанса в контроллерах и представлениях следующим образом:
Session["SessionKey1"]
Как вы получаете доступ к значениям сеанса из класса, отличного от контроллера или представления?
Мы можем получить доступ к данным сеанса в контроллерах и представлениях следующим образом:
Session["SessionKey1"]
Как вы получаете доступ к значениям сеанса из класса, отличного от контроллера или представления?
Я бы использовал инъекцию зависимостей и передал экземпляр HttpContext (или только сеанс) в класс, которому нужен доступ к сеансу. Другой альтернативой является ссылка на 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";
Вот моя версия решения для этой проблемы. Обратите внимание, что я также использую инъекцию зависимостей, единственное существенное отличие заключается в том, что к объекту "session" обращаются к Singleton
private iSession _Session;
private iSession InternalSession
{
get
{
if (_Session == null)
{
_Session = new SessionDecorator(this.Session);
}
return _Session;
}
}
Вот класс SessionDecorator, который использует шаблон Decorator для переноса сеанса вокруг интерфейса:
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;
}
}
}`
Надеюсь, что это поможет:)
Не сделал этого сам, но этот образец из блога Чада Майера может помочь (из этого сообщения: 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);
}
Я бы также обернул все переменные сеанса в один файл класса. Таким образом вы можете использовать intelliSense для их выбора. Это сокращает количество шагов в коде, где вам нужно указать "строки" для сеанса.