2012-05-27 21 views
9

Estaba intentando hacer un sitio como sesión menos. Así que agrega <sessionState mode="Off" /> a mi web.config. Después de que si ejecutoUsando TempData mientras <modoSesiónState = "Desactivado" />

Session["test"] = "yes"; 

me da un error “referencia a objeto no establecida como instancia de un objeto. "Esto está bien.

Pero con esta configuración puedo configurar

TempData["test"] = "yes"; 

en el controlador e imprimir TempData["test"]; En la vista página. Está funcionando bien.

Según MSDN "El valor de la propiedad TempData se almacena en estado de sesión".

Entonces, si menciono <sessionState mode="Off" />, ¿cómo funciona TempData? ¿Sigue ASP.NET almacenando TempData en sesión o en otro lugar?

Respuesta

16

Esto puede funcionar con el estado de sesión deshabilitado solo si imprime TempData["test"] en su vista durante la misma solicitud, por lo que este valor se elimina del diccionario TempData y MVC no intenta guardarlo en el estado de la sesión. Intenta sacarlo de su punto de vista y obtendrá System.InvalidOperationException: The SessionStateTempDataProvider class requires session state to be enabled.

Puede deshabilitar individualmente el estado de sesión para sus controladores mediante la adición de [SessionState(SessionStateBehavior.Disabled)] atributo o la implementación de su propio proveedor de TempData usando ITempDataProvider interfaz.

[EDIT] Sólo para explicar mi primer punto, imaginemos dos situaciones:

  • Tiene acción del controlador que asigna un valor a TempData["test"] y una vista correspondiente que se está devolviendo de esta acción y grabados estos datos . En este caso, todo funcionará incluso sin un estado de sesión porque no es necesario almacenar TempData["test"] entre las solicitudes.
  • Tiene acción de controlador que asigna algún valor a TempData["test"] pero redirige al usuario a otra acción con su propia vista que imprime esta información. En este caso, no funcionará con el estado de sesión deshabilitado ya que MVC necesita almacenar su valor TempData["test"] entre dos solicitudes.
+0

Entiendo acerca de ITempDataProvider y gracias por eso. También descubrí que, en lugar de la sesión, puede guardar los datos temporales en las cookies desde aquí. http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx. –

+0

Sí, el tipo ha implementado su propio proveedor TempData basado en cookies. –

+0

Usamos TempData para solicitud única ¿no? Así que establecemos el valor de TempData en el controlador y accedemos a la página Ver. Me queda una duda sobre "Intenta eliminarla de tu vista y obtendrás un error". ¿Puedes por favor explicar eso? –

Cuestiones relacionadas