Hola
estoy tratando de crear un diccionario pero utilizando sesiones, es esto posible?
osea que necesito crear una coleccion pero con una variable sesion
| |||
Lo primero que se hace es un sentencia condicional para comprobar si la sesion en la que guardarás el diccionario es un objeto, dicho de otra forma, se busca comprobar si la sesion ya ha sido referenciada al objeto diccionario. Si todavía no fue referenciada, quiere decir que no se creó el objeto diccionario, entonces lo creas. Posterior a eso viene el trabajo que tengas que hacer con el objeto diccionario, y luego que terminas tu tarea con el objeto, guardas los cambios en la sesion (lo referencias a la sesion). Acá está el código, esto lo uso yo para un carro de compras, luego de la sentencia condicional lo que hago es hacer la tarea correspondiente con el objeto, en mi caso es añadir un nuevo elemento al objeto o si este existe actualizar la cantidad. if isobject(session("carro")) then set carro=session("carro") else 'Si no creo el objeto diccionario CARRO set carro = Server.CreateObject("Scripting.Dictionary") end if if carro.Exists(Id) then carro(Id) = Cantidad else carro.Add Id, 1 end if set session("carro") = carro Espero que me haya explicado bien para que lo entiendas y te funcione. Saludos!. |
| |||
claro, si lo haces en una página distinta no tienes que hacer carro.Remove(clave), sino que tienes que hacer sesion_que_contenga_el_carro.Remove(clave). Esto es porque una vez que sales de la página en donde creaste el carro, el objeto carro de por sí ya no esta más disponible como "carro" (o según el nombre que lo hayas creado), sino que estará disponible mediante la sesion que lo contiene. Y en todas las páginas (excepto la página en donde creaste el objeto) que realices tareas con el objeto carro que creaste, tendrás que acceder a el mediante la sesion que lo contiene. Si no quieres accederlo mediante la sesion, se me ocurre que podrías hacer algo así: Dim carro carro = session("Carro") 'Acá guardamos en la variable "carro" todos los datos de la sesion carro.Remove(clave) 'Trabajas con la variable session("Carro") = carro 'Y acá, los cambios que realizas con la variable "carro" los guardas nuevamente en la sesión Un saludo y espero que te sirva. |
| ||||
Hola Probaste esa sintaxis ? Creo que debería ser como: Dim carro 'Detalle, necesitas decir set... pero no he probado sin set set carro = session("Carro") carro.Remove(clave) 'Trabajas con la variable session("Carro") = carro 'Y acá, los cambios que realizas con la variable "carro" los guardas nuevamente en la sesión De la última línea, no estoy seguro si pasan estas dos cosas: 1. Si usas set VAR = session("OBJ"), entonces en VAR se crea completamente una colección nueva de elmentos, entonces al momento de hacer VAR.REMOVE, se hace solamente sobre ese objeto y no sobre session, por lo cual, la última línea sería totalmente necesaria. 2. Si usas set VAR = session("OBJ"), solamente se crea una instancia hacia session("OBJ"), entonces cuando haces VAR.REMOVE, automáticamente ya se elimino de session("OBJ"), porque VAR estaba apuntando a session("OBJ") Por otra parte, quizás caso 1, pasa con SET, y caso dos pasa si no usas SET, pero es importante revisar ese caso y estar seguro, para ustedes que están realizando tantas modificaciones a ese objeto de SESSION. Por otra parte, yo recomendaría que si pueden trabajar directo con el objeto en SESSION, pues es mejor que bajarlo a una variable local. Pero si es perfectamente valido pasarlo por referencia a una función como: mostrarProductos(session("OBJ")) function mostrarProductos(ByRef obj) Eso es totalmente correcto, pero me refiero, a que si lo usas en una misma página para algo rapido, pues mejor usarlo directo en SESSION, como... session("Carro").Remove(clave) 'Trabajas con session Así te evitas muchos movimientos en la memoria. Suerte!! |
| |||
Claro, estoy totalmente de acuerdo con vos Neuron, si eso es lo que yo le había mencionado al principio que hiciera. De hecho, es como lo hago yo en mi página. Lo de pasar la sesion a una variable local nunca lo probé, pero se me había ocurrido que podía hacerse de esa forma, pero no lo probé, lo cual fue un error obviamente. Lo que si no estoy seguro que suceda es si eliminas la última linea si realmente se actualiza la sesion. No puedo probarlo, porque no me funcionan las páginas asp, pero sería cuestión de probar un poco para ver como funciona. Y lo del SET me parece que tiene que ser con el, yo no lo agregué porque se me pasó realmente, pero supongo que debes poner la palabra reservada delante. Un saludo Neuron!. |
| ||||
La teoría resulto correcta... Hice este script sencillo para probar, y resulta que si, el SET es obligatorio, nunca lo habia probado hacer sin SET, por otra parte, al parecer todo comparte el mismo espacio de memoria, es como un apuntador a lo mismo, entonces si aplicas un remove a un elemento, se hace a todos. Espero que les sirva a ustedes que estás usando objDict mucho en sus páginas. Cita: Suerte!! Dim objDict Dim objTemp Dim varElemento 'Crear el objeto para guardar las fotografías. set objDict = CreateObject("Scripting.Dictionary") objDict.Add "intVar1", 1 objDict.Add "intVar2", 2 objDict.Add "intVar3", 3 set Session("objDictS") = objDict Response.Write "Inicializados: <br><br>" Response.Write "Variable objDict: <br>" For Each varElemento in objDict Response.Write varElemento & " : "& objDict.Item(varElemento)& "<br>" Next Response.Write "<br>Session objDictS: <br>" For Each varElemento in Session("objDictS") Response.Write varElemento & " : "& Session("objDictS").Item(varElemento)& "<br>" Next Response.Write "<br><hr><br>" Response.Write "Borrando usando set en una variable objTemp: <br><br>" set objTemp = Session("objDictS") objTemp.Remove("intVar2") Response.Write "Variable objTemp: <br>" For Each varElemento in objTemp Response.Write varElemento & " : "& objTemp.Item(varElemento)& "<br>" Next Response.Write "<br>Variable objDict: <br>" For Each varElemento in objDict Response.Write varElemento & " : "& objTemp.Item(varElemento)& "<br>" Next Response.Write "<br>Session: <br>" For Each varElemento in Session("objDictS") Response.Write varElemento & " : "& Session("objDictS").Item(varElemento)& "<br>" Next Response.Write "<br><hr><br>" Response.Write "Borrando directo en el objeto de memoria: <br><br>" Session("objDictS").Remove("intVar1") Response.Write "Variable objTemp: <br>" For Each varElemento in objTemp Response.Write varElemento & " : "& objTemp.Item(varElemento)& "<br>" Next Response.Write "<br>Variable objDict: <br>" For Each varElemento in objDict Response.Write varElemento & " : "& objTemp.Item(varElemento)& "<br>" Next Response.Write "<br>Session: <br>" For Each varElemento in Session("objDictS") Response.Write varElemento & " : "& Session("objDictS").Item(varElemento)& "<br>" Next |