Как работает состояние сеанса в MVC 2.0? - PullRequest
2 голосов
/ 29 июля 2010

У меня есть контроллер, который хранит различную информацию (т. Е. FormID, QuestionAnswerList и т. Д.).В настоящее время я храню их в Controller.Session, и он работает нормально.

Я хотел разбить некоторую логику на отдельный класс (т. Е. RulesController), где я мог бы выполнять определенные проверки и т. Д., Но когда япопробуй сослаться на сессию там, это ноль.Понятно, что сессия остается действительной только в контексте конкретного контроллера, но что все делают по этому поводу?

Я думаю, что это довольно часто, вы хотите разделить определенные "глобальные" переменные в разныхконтроллеры, что является лучшей практикой?

Вот часть моего кода:

В моем классе BaseController:

    public List<QuestionAnswer> QuestionAnswers
    {
        get
        {
            if (Session["QuestionAnswers"] == null)
            {
                List<QuestionAnswer> qAnswers = qaRepository.GetQuestionAnswers(CurrentSection, UserSmartFormID);
                Session["QuestionAnswers"] = qAnswers;
                return qAnswers;
            }
            else
            {
                return (List<QuestionAnswer>)Session["QuestionAnswers"];
            }
        }
        set
        {
            Session["QuestionAnswers"] = value;
        }
    }

В моем первом контроллере (производном от BaseController):

QuestionAnswers = qaRepository.GetQuestionAnswers(CurrentSection, UserSmartFormID);

Я прошел по коду и вышеприведенный оператор выполняется нормально, устанавливая Session ["QuestionAnswers"], но затем, когда я пытаюсь получить от другого контроллера ниже, Session ["QuestionAnswers"]is null!

Мой второй контроллер (также производный от BaseController):

List<QuestionAnswer> currentList = (List<QuestionAnswer>)QuestionAnswers;

Сбой приведенной выше строки!Похоже, сам объект Session является нулевым (не только Session ["QuestionAnswers"])

Ответы [ 4 ]

1 голос
/ 30 июля 2010

Я полагаю, что TempData решит вашу проблему, она работает в сеансе и сохраняется при нескольких запросах, однако по умолчанию она удаляет сохраненные данные при повторном обращении к ним, если это проблема, вы можете сказать ей сохранить информациюс недавно добавленной функцией Keep ().

Итак, в вашем случае: ... TempData ["QuestionAnswers"] = qAnswers;...

Более подробная информация доступна по адресу: http://weblogs.asp.net/jacqueseloff/archive/2009/11/17/tempdata-improvements.aspx

1 голос
/ 30 июля 2010

Где вы получаете доступ к сеансу во втором контроллере?Объект сеанса недоступен в конструкторе, поскольку он внедряется позднее в жизненный цикл.

1 голос
/ 29 июля 2010

имеет значение, если вы извлекаете сеанс, используя

HttpContext.Current.Session("mySpecialSession")  ''# note this is VB, not C#
0 голосов
/ 07 августа 2010

Хорошо, наконец-то все заработало, хотя и немного глупо. Я нашел решение от другого связанного SO сообщения.

Я добавил в свой BaseController следующее:

        public new HttpContextBase HttpContext
    {
        get
        {
            HttpContextWrapper context =
                new HttpContextWrapper(System.Web.HttpContext.Current);
            return (HttpContextBase)context;
        }
    }

Затем установите / извлеките мои переменные Session, используя HttpContext.Session, и все отлично работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...