Я пишу веб-приложение, которое позволит пользователю просматривать несколько веб-страниц на сайте, делая определенные запросы. Вся информация, которую вводит пользователь, будет храниться в объекте, который я создал. Проблема в том, что мне нужен доступ к этому объекту из любой части сайта, и я не знаю, как лучше всего это сделать. Я знаю, что одним из решений является использование переменных сеанса, но я не знаю, как их использовать в asp .net MVC. И где бы я объявил переменную сеанса? Есть ли другой путь?
169
Ответы:
Я думаю, вы захотите подумать, действительно ли вещи принадлежат состоянию сеанса. Это то, что я делаю время от времени, и это хороший строго типизированный подход ко всему, но вы должны быть осторожны, когда помещаете вещи в контекст сеанса. Не все должно быть там только потому, что оно принадлежит какому-то пользователю.
в global.asax перехватить событие OnSessionStart
Из любого места в коде, где свойство HttpContext.Current! = Null, вы можете получить этот объект. Я делаю это с помощью метода расширения.
Таким образом, вы можете в коде
источник
Ответ здесь правильный, однако я изо всех сил пытался реализовать его в приложении ASP.NET MVC 3. Я хотел получить доступ к объекту Session в контроллере и не мог понять, почему я продолжал получать «Экземпляр не установлен в экземпляр ошибки объекта». Я заметил, что в контроллере, когда я пытался получить доступ к сеансу, выполняя следующее, я продолжал получать эту ошибку. Это связано с тем, что this.HttpContext является частью объекта Controller.
Однако я хотел, чтобы был HttpContext, который является частью пространства имен System.Web, потому что именно этот ответ предлагает использовать в Global.asax.cs ответ выше. Поэтому я должен был сделать следующее:
это помогло мне, не уверен, что я сделал что-то, кроме МО здесь, но я надеюсь, что это кому-то поможет!
источник
Поскольку мне не нравится видеть «HTTPContext.Current.Session» об этом месте, я использую одноэлементный шаблон для доступа к переменным сеанса, он дает вам легкий доступ к строго типизированному пакету данных.
тогда вы можете получить доступ к своим данным из любого места:
источник
Если вы используете asp.net mvc, вот простой способ получить доступ к сеансу.
Из контроллера:
Из вида:
Это определенно не лучший способ доступа к переменным сеанса, но это прямой маршрут. Поэтому используйте его с осторожностью (желательно во время быстрого создания прототипов) и используйте Wrapper / Container и OnSessionStart, когда это станет уместным.
НТН
источник
Ну имхо ..
Что касается # 1, у меня есть строго типизированный Master View, у которого есть свойство для доступа к тому, что представляет объект Session .... в моем случае, строго типизированный Master View является универсальным, что дает мне некоторую гибкость в отношении строго типизированных View Pages.
а потом...
источник
Хотя я не знаю насчет asp.net mvc, но это то, что мы должны делать на обычном веб-сайте .net. Это должно работать и для asp.net mvc.
Вы бы поместили это в метод для легкого доступа. НТН
источник
Есть 3 способа сделать это.
Я предпочитаю 3-й способ. Эта ссылка является хорошей ссылкой.
Методы сеанса Get / Set HttpContext в BaseController vs Mocking HttpContextBase для создания методов Get / Set
источник
Мой способ доступа к сеансам - написать вспомогательный класс, который инкапсулирует различные имена полей и их типы. Я надеюсь, что этот пример помогает:
источник
Отличные ответы от ребят, но я бы предостерег вас от того, чтобы всегда полагаться на сессию. Это быстро и легко сделать, и, конечно, будет работать, но не будет хорошо во всех ситуациях.
Например, если вы столкнулись со сценарием, в котором ваш хостинг не позволяет использовать сеанс, или вы находитесь в веб-ферме, или в примере общего приложения SharePoint.
Если вам нужно другое решение, вы можете использовать контейнер IOC, например Castle Windsor , создать класс провайдера в качестве оболочки и затем сохранить один экземпляр вашего класса, используя индивидуальный запрос или образ жизни сеанса, в зависимости от ваших требований.
МОК будет гарантировать, что один и тот же экземпляр возвращается каждый раз.
Сложнее да, если вам нужно простое решение, просто используйте сеанс.
Вот некоторые примеры реализации ниже из интереса.
Используя этот метод, вы можете создать класс провайдера в соответствии с:
И зарегистрируйте это примерно так:
источник
Вы можете использовать ViewModelBase в качестве базового класса для всех моделей, этот класс будет заботиться о получении данных из сессии
Вы можете написать метод расширения в HttpContextBase для работы с данными сеанса
Используйте это как ниже в контроллере
Второй аргумент является необязательным, он будет использоваться для заполнения данных сеанса для этого ключа, когда значение не присутствует в сеансе.
источник