ASP.NET MVC - Как получить доступ к данным сеанса в местах, отличных от Controller и Views - PullRequest
22 голосов
/ 09 апреля 2009

Мы можем получить доступ к данным сеанса в контроллерах и представлениях следующим образом:

Session["SessionKey1"]

Как получить доступ к значениям сеанса из класса, отличного от контроллера или представления?

Ответы [ 5 ]

33 голосов
/ 09 апреля 2009

Я бы использовал внедрение зависимостей и передавал экземпляр HttpContext (или просто сессию) в класс, которому нужен доступ к Session. Другой альтернативой является ссылка на 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"];
            ...
        }
   }
23 голосов
/ 09 апреля 2009

Вам просто нужно позвонить через HttpContext примерно так:

HttpContext.Current.Session["MyValue"] = "Something";
1 голос
/ 09 сентября 2010

Вот мой вариант решения этой проблемы. Обратите внимание, что я также использую внедрение зависимостей, единственное существенное отличие состоит в том, что доступ к объекту «сеанса» осуществляется через 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;
        }
    }
}`

Надеюсь, это поможет:)

0 голосов
/ 12 мая 2009

Я бы также обернул все переменные сеанса в один файл класса. Таким образом, вы можете использовать intelliSense для их выбора. Это сокращает количество шагов в коде, где вам нужно указать «строки» для сеанса.

0 голосов
/ 09 апреля 2009

Сам не сделал, но этот пример из блога Чеда Мейера может помочь (из этого поста: 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...