none
datos temporales entre controladores y vista RRS feed

  • Pregunta

  • Hola, quisiera que me guien para elegir session o Tempdata o ViewData; qué le quedaria mejor a la situacion de tener que pasar datos entre controladores??, y que para pasar datos temporales entre controlador y la vista?, otro detalle que me gustaria saber es si estos datos se hacen unicos para cada usuario de la app, es decir si puedo confiar en ellos para que los usuarios puedan mandar valores propios de cada uno y el sistema responda al usuario en base a estos valores, sin mezclarlos o sobrescribirlos  con lo valores de otro usuario en linea que este invocando la misma acción del controlador.

    Saludos cordiales 

    martes, 22 de noviembre de 2011 20:07

Respuestas

  • Buenas.

    No existe el concepto de "datos temporales" entre controlador y vista. O más bien dicho todos lo son. A ver, el controlador llama a la vista, le pasa unos datos y luego "se olvida" de la vista y de todo. Recuerda que cada ciclo controlador ---> vista es una petición http completa.

    El objetivo de TempData no es pasar datos entre el controlador y la vista, es pasar datos entre llamadas encadenadas a dos o más controladores. Una situación a la que te puedes encontrar si haces redirects (y sigues el patrón Post->Redirect->Get). Ojo con TempData que es mucho más puñetero de lo que parece. Para empezar internamente usa la sesión y si no vigilas puedes quedarte con una sesión llena de basura. El maestro José María Aguilar lo cuenta fenomenal en su blog: http://www.variablenotfound.com/2010/02/tempdata-en-aspnet-mvc-2.html

    Así pues descartamos TempData. Lo que nos deja ViewData y Sesión. La sesión también queda descartada por una razón muy simple: en mi opinión debería ser imposible acceder a la sesión desde una vista. ¿Porque quieres acoplar la vista, algo "tonto", a un elemento de HttpContext como la Sesión? Si alguien accede a la sesión debe ser el controlador, encapsular esos datos dentro de un ViewModel o en el ViewData y mandarselos a la vista. Hace tiempo escribí en mi blog un post sobre como usar la sesión en ASP.NET MVC (http://geeks.ms/blogs/etomas/archive/2010/06/30/asp-net-mvc-q-amp-a-c-243-mo-usar-la-sesi-243-n.aspx). Échale un vistazo que creo que te aclarará algunos pequeños conceptos.

    Así pues: Para pasar datos de un controlador a una vista, usa ViewData o un ViewModel. Estos son los dos mecanismos previstos para ASP.NET MVC para esos temas. Para pasar datos entre dos controladores puedes usar TempData, pero ten en cuenta las consideraciones que expone José María en su blog.

    ¿Datos únicos en la app? Explícate mejor porque no termino de entender... A ver, si dos usuarios están invocando a la misma acción del controlador, los datos que el controlador recibe no se sobreescriben. Considera que tienes "dos instancias" del controlador uno responde a un usuario y el otro al otro usuario. Recuerda que los controladores son stateless (se crean y destruyen a cada petición http). Eso significa que si te llegan dos peticiones sucesivas no sabes si son del mismo usuario o diferentes. Puedes usar la sesión para guardar datos persistentes, puedes usar la bbdd (si el usuario está autenticado y existe en User.Identity). La pregunta que yo siempre hago cuando alguien plantea usar la sesión es: ¿la necesitas realmente?

    Saludos!

     

     


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    • Propuesto como respuesta Laura Ibarra Molas sábado, 26 de noviembre de 2011 15:26
    • Marcado como respuesta Eder Costa jueves, 18 de octubre de 2012 14:41
    miércoles, 23 de noviembre de 2011 7:32