Variable sesión carga un solo objeto

publicado por: Anonymous

Tengo un botón agregar al carrito que obtiene el nombre del libro seleccionado de un ListView, y se guarda (junto con otros datos) en un objetoCarrito, el mismo se guarda en una lista, y la lista en una variable de sesion (todo esto para mostrarlo luego en un gridView). El problema es que –no logro descubrir en qué parte– se carga un sólo objeto, es decir, siempre me reemplaza el objeto ya guardado con el recién seleccionado. Acá adjunto el código de la función AgregarAlCarrito:

Código:

protected void addCarrito_Command(object sender, CommandEventArgs e)
{
    string nombre = e.CommandArgument.ToString();
    Carrito objCarrito = new Carrito();
    objCarrito.agregarArtCarrito(nombre, objCarrito);
    List<Carrito> productos = new List<Carrito>();
    productos.Add(objCarrito);
    Session["carrito"] = productos;
}

La función de objCarrito.agregarArtCarrito (que está en una clase carrito) es la siguiente:

public void agregarArtCarrito(string nombre, Carrito objCarrito)
{
    Articulos objArt = new Articulos();
    Autores objAutor = new Autores();
    objCarrito.CodArt_ = objArt.buscarCodigo(nombre);
    objCarrito.Precio_ = objArt.buscarPrecio(objCarrito.CodArt_);
    objCarrito.Nombre_ = nombre;
    objCarrito.NombreAutor_ = objAutor.buscarNombre(objArt.buscarCodAutor(objCarrito.CodArt_));
}

solución

El tema es con esta línea:

List<Carrito> productos = new List<Carrito>();

Siempre estás creando la instancia de los productos y como se crea como una lista vacía, al agregarla a la variable de sesión siempre agregas el último objeto. Sugiero que inicialmente hagas la instancia de la lista, luego, valides si ya existe alguna variable en sesión y si ya existe recuperas la lista agregando el último producto, por ejemplo:

List<Carrito> productos = new List<Carrito>();
if(Session["carrito"] != null)
    productos = (List<Carrito>)Session["carrito"];

Para que finalmente, tu código quede de la siguiente forma:

protected void addCarrito_Command(object sender, CommandEventArgs e)
{
    string nombre = e.CommandArgument.ToString();
    Carrito objCarrito = new Carrito();
    objCarrito.agregarArtCarrito(nombre, objCarrito);
    List<Carrito> productos = new List<Carrito>();
    if(Session["carrito"] != null)
        productos = (List<Carrito>)Session["carrito"];
    productos.Add(objCarrito);
    Session["carrito"] = productos;
}

Es decir, primero validas que exista, si existe recuperas los productos existentes y posteriormente agregas el actual.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *