MVC 3 Session.Abandon () вызывается перед установкой TempData ["myvalue"] = "foo" заставляет следующий контроллер иметь TempData как ноль - PullRequest
5 голосов
/ 24 сентября 2011

У меня есть логика контроллера, которая ищет: Значение сеанса

 //checks value null etc..  for existing record in session memory.
 Session["certnum"]  

Тогда в контроллере я решил создать условие, в котором:

 //is called to initiate a New Record that will be created.
 Session.Abandon();

Однако вэто процедурное кодирование Session.Abandon ();предшествует созданию TempData ["myobject"] = "foo", и после пошагового выполнения кода TempData в ближайшем окне показывает мое значение, и все кажется хорошим.Затем при перенаправлении на другой контроллер:

return RedirectToAction("ChildInfo", "NewRecord");  

Этот метод ChildInfo больше не имеет значения TempData ... Теперь он нулевой.Метод отмены сеанса был вызван задолго до того, как было установлено значение TempData, не уверен, является ли это ошибкой в ​​сеансах MVC, но для меня это не имеет смысла.Если я создаю новую облегченную сессию TempData, то она должна сохраняться на следующем контроллере.Если я удаляю метод Session.Abandon (), то значение TempData продолжает работать, как и раньше.

Ответы [ 3 ]

11 голосов
/ 24 сентября 2011

Метод Session.Abandon() очищает текущий сеанс в конце запроса, что он предназначен для этого.

См. http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon.aspx

Если вы хотите перенаправить надругое действие, вам нужно вызвать перенаправление, как вы сделали.Если вы используете Abandon(), запрос получит новый идентификатор сеанса.

Если вы хотите удалить что-то из сеанса, вам нужно использовать методы Session.Remove или Session.RemoveAll (Также Clear может бытьиспользуется для того же, что и RemoveAll. Это может быть сделано:

Session.Remove(itemToRemove);

или

Session.RemoveAll()

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

1 голос
/ 24 сентября 2011

Метод Session.Abandon не очищает объект сеанса, он только указывает, что его не следует хранить. Объект сеанса все еще не поврежден во время текущего запроса.

Когда ответ завершен, объект сеанса прекращается, поэтому в следующий раз, когда браузер делает запрос, сервер должен установить новый объект сеанса. Все, что вы помещаете в объект сеанса во время всего этого запроса, исчезает, когда объект сеанса прекращается.

Когда вы делаете перенаправление, страница перенаправления отправляется как ответ браузеру, который затем запрашивает новую страницу. Если вы отметите объект сеанса как отказавшийся, а затем выполните перенаправление, новая страница получит новый объект сеанса.

0 голосов
/ 24 сентября 2011

Вот как это должно работать.

Session.Abandon не прерывает сеанс сразу. Это длилось до конца страницы. Затем при следующей загрузке страницы создается новый сеанс.

...