2011-09-23 5 views
5

I tiene un controlador de lógica hará que busca un: valor de sesiónMVC 3 Session.Abandon() llamada antes de fijar un TempData [ "MyValue"] = "foo" hace que el siguiente controlador de tener TempData como nulo

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

Luego, en el controlador de E habían decidido tener una condición donde:

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

Sin embargo, en la codificación de procedimiento es que Session.Abandon(); viene antes de la creación de TempData ["myobject"] = "foo", y al recorrer el código, TempData en la ventana inmediata muestra mi valor y todo parece estar bien. A continuación, a redirigir a otro controlador:

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

Este método ChildInfo ya no tiene el valor TempData ... Ahora bien, es nula. El Método de abandono de sesión se llamó mucho antes de que se estableciera el valor de TempData, no estoy seguro de si esto es un error con MVC Sessions, pero eso no tiene sentido para mí. Si estoy creando una nueva sesión lighweight TempData, entonces debe persistir en el siguiente controlador. Si elimino el método Session.Abandon(), el valor de TempData continuará funcionando como lo hizo anteriormente.

+0

Lo importante aquí es que TempData depende de la sesión. La sesión se ha ido, por lo tanto, TempData se ha ido. –

+0

@ Adam Sí, me doy cuenta de que, sin embargo, estoy llamando a Session.Abandon() antes de crear un valor de TempData, estoy en el mismo método actionresult de un controlador, pero aun así, eso me parece una locura. –

+0

¿por qué sería una locura? está restableciendo un objeto requerido para tempdata. Eso es como decir "borro todas las filas de la tabla, pero no entiendo por qué en la próxima solicitud la fila que voy a solicitar no está allí". :) –

Respuesta

11

El método Session.Abandon() borra la sesión actual al final de la solicitud, que es lo que está diseñado para hacer.

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

Si desea redirigir a una acción diferente, usted tiene que llamar a la redirección al igual que ha hecho. Si usa Abandon(), la solicitud obtendrá una nueva identificación de sesión.

Si desea eliminar algo de una sesión es necesario utilizar los Session.Remove o Session.RemoveAll métodos (también Clear se puede utilizar para hacer lo mismo que RemoveAll Esto se haría por:.

Session.Remove(itemToRemove); 

o

Al usar cualquiera de estas dos opciones, puede eliminar algunos o todos los datos almacenados anteriormente de la sesión sin causar que el ID de la sesión se regenere en la próxima solicitud.

+0

¡Gracias, Bernie! –

1

El método Session.Abandon no borra el objeto de sesión, solo indica que no debe mantenerse. El objeto de sesión aún está intacto durante la solicitud actual.

Cuando se completa la respuesta, el objeto de sesión se abandona, de modo que la próxima vez que el navegador realiza una solicitud, el servidor debe configurar un nuevo objeto de sesión. Todo lo que coloca en el objeto de sesión durante esa solicitud completa desaparece cuando se abandona el objeto de sesión.

Cuando realiza una redirección, se envía una página de redirección como respuesta al navegador, que luego solicita la nueva página. Si marca el objeto de sesión para ser abandonado y luego hace un redireccionamiento, la nueva página obtendrá el nuevo objeto de sesión.

+0

Entiendo ahora. Gracias Guffa. –

0

Así se supone que funciona.

Session.Abandon no mata la sesión inmediatamente. Dura hasta el final de la página. Luego, en la siguiente carga de página, se crea una nueva sesión.

+0

¡Gracias! Lo aprecio –

Cuestiones relacionadas