E-commerce e carrello con ASP.NET

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Il carrello

La struttura del sito e delle varie pagine sono molto semplici. Il layout per le pagina principale dove compare la lista delle locandine dei film e il dettaglio di ogni film si divide in tre parti: la superiore dov'è presente il titolo che è un usercontrol a sé, dal nome "titolo.ascx", la parte centrale dov'è presente la lista dei film o il loro dettaglio, e la colona a destra che è un altro usercontrol di nome "carrello.ascx".

Solo le pagine per il login (login.aspx), dei dati personali e del riepilogo (checkout/default.aspx) non presentano l'usercontrol con l'elenco dei film presenti nel carrello.

All'interno della webapplication è presente un database in formato Access (per la massima trasportabilità):

Immagine

All'interno i film presenti nella tabella "Lista" (i titolo presenti per questo esempio sono una decina), con una relazione con la tabella "Attori", indispensabile per la visualizzazione dei dettagli nell'apposita pagina dell'esempio.

La pagina principale visualizza la lista dei film con un banale DataList, con l'assegnazione ad ogni film di un link alla pagina "dettagli.aspx" con il parametro aggiuntivo ricavato attraverso l'id del film stesso. In questa pagina vengono visualizzati i dettagli presi dal database, e con un link alla pagina "carrello.aspx" al quale viene passato ancora l'id del film, viene aggiunto realmente il film al carrello.

Per la memorizzazione del carrello viene utilizzata una banale Hashtable , che consente di memorizzazione dei dati con l'identificazione per "key" (chiave) così come gli oggetti dictionary presenti in Classic ASP. La sintassi di questo oggetto è semplicissimo:

dim collezione as new Hashtable()
collezione("nome")="Andrea"

Per riprendere il valore inserito è sufficiente invece:

Dim nome as string=collesione("nome").ToString()

Nel nostro carrello come chiave utilizziamo l'id del film presente nel database, e come valore la quantità decisa dall'utente dalla pagina carrello.aspx. Vediamo il codice che esegue questa operazione:

void Page_Load()
  {
  if (!Page.IsPostBack)
  {
   if (Request.QueryString["id"]!=null)
   {
     if (!FS.Exist("carrello")) FS.Write("carrello",new Hashtable());
     Hashtable ht=(Hashtable)FS.Read("carrello");
     string idx=Request.QueryString["id"].ToString();
     if (ht[idx]!=null)
      ht[idx]=Convert.ToInt32(ht[idx])+1;
     else
      ht[idx]=1;
     }
   RiprendiDati();
   }
  }

All'inizio viene controllato se tale pagina non è stata richiamata da un evento della stessa, si controlla se è presente l'id del film nella collection QueryString della classe HttpRequest e se presente viene innanzitutto controllato l'oggetto Hashtable, per verificare che contenga il nostro carrello.

Qualora non lo fosse, viene creato e inserito nel FileSession, in modo che sia visibile a tutte le pagine per l'utente corrente. Infine viene controllato se in tale oggetto è già presente l'id del film, aggiornando in questo caso la sola quantità.

Sempre nella stessa pagina viene visualizzato il riepilogo dell'ordine con la possibilità di aggiornare la quantità o cancellare gli articoli presenti.

Vediamo innanzitutto come viene creato dall'oggetto Hashtable contenente il carrello il datagrid completo di tutte le informazioni. Andiamo nella funzione RipendiDati:

void RiprendiDati()
{
  try
  {
   checkout.HRef=null;
   FS.Remove("carrello2");
   Hashtable ht=null;

Controllo se è presente l'oggetto Hashtable "carrello":

    if (!FS.Exist("carrello"))
   {
     msg.InnerText="Non hai nessun articolo nel carrello!";
   return;
   }
   ht=(Hashtable)FS.Read("carrello");
   if (ht.Count==0)
   {
     msg.InnerText="Non hai nessun articolo nel carrello!";
     return;
   }
   checkout.HRef="checkout/default.aspx";

Quindi leggiamo dal database la lista dei film da cui prenderemo le informazioni:

    using (OleDbConnection conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Request.MapPath("Film.mdb")))
   {
     OleDbDataAdapter adapter=new OleDbDataAdapter("SELECT * FROM Lista", conn);
     DataSet ds=new DataSet();
     adapter.Fill(ds,"Lista");

Creiamo un nuovo DataTable con le informazioni che utilizzeremo per popolare il DataGrid:

     DataTable dt=new DataTable("carrello");
     dt.Columns.Add("articolo",typeof(int));
     dt.Columns.Add("film",typeof(string));
     dt.Columns.Add("quantita",typeof(int));
     dt.Columns.Add("prezzo",typeof(float));
     dt.Columns.Add("prezzo tot",typeof(float));
     DataRow dr=null;

Leggiamo tutti i dati presenti nell'oggetto Hashtable "carrello", quindi ricerchiamo nel dataset con il contenuto del film, le informazioni dettagliate per ogni singolo film:

     IDictionaryEnumerator eid = ht.GetEnumerator();
     while (eid.MoveNext())
     {
      DataRow dr2=ds.Tables[0].Rows[Convert.ToInt32(eid.Key)-1];
      dr=dt.NewRow();
      dr["articolo"]=eid.Key;
      dr["film"]=dr2["titolo"];
      dr["quantita"]=eid.Value;
      dr["prezzo"]=dr2["prezzo"];
      dr["prezzotot"]=Convert.ToDouble(dr2["prezzo"])*Convert.ToDouble(eid.Value);
      totale+=Convert.ToDouble(dr2["prezzo"])*Convert.ToDouble(eid.Value);
      dt.Rows.Add(dr);
     }

Quindi inseriamo il DataTable appena creato nel datagrid per la visualizzazione finale:

    DataGrid1.DataSource=dt;
   DataGrid1.DataBind();
   FS.Write("carrello2",dt);
  } catch {}
}

Si noti l'ultima riga, con l'inserimento del DataTable appena creato nel FileSession. Vedremo di seguito il perché.

Per la modifica o la cancellazione dei film dal carrello utilizzeremo gli eventi del datagrid e opereremo direttamente sull'oggetto Hashtable "carrello":

private void cliccato(object source, DataGridCommandEventArgs e)
{
  string quale=e.CommandName.ToString();
  if (quale=="Aggiorna")
  {
   Hashtable ht=(Hashtable)FS.Read("carrello");
   foreach (DataGridItem item in DataGrid1.Items)
   {
     TextBox tx=(TextBox)item.Cells[2].Controls[0].FindControl("quantity");
     string ind=item.Cells[0].Text;
     int quanti=Convert.ToInt32(tx.Text);
     ht[ind]=quanti;
   }
  }
  if (quale=="Delete")
  {
   Hashtable ht=(Hashtable)FS.Read("carrello");
   string key=DataGrid1.Items[e.Item.ItemIndex].Cells[0].Text;
   ht.Remove(key);
  }
  RiprendiDati();
}

Se viene cliccato il pulsante "Modifica" vengono lette tutte le righe presenti nel datagrid, sia l'id che la quantità, e viene aggiornato l'oggetto "carrello". Nel caso venga cliccato il pulsante "Delete", viene cancellato dall'oggetto Hashtable la "key" corrispondente al film.

Come si ricorderà, viene memorizzato l'oggetto DataTable nel FileSession, questo per poterlo riutilizzare nell'usercontrol "carrello.ascx", quello che viene inserito nella pagina principale e quello del dettaglio:

if (FS.Exist("carrello2"))
{
  elenco.Visible=false;
  DataTable dt=(DataTable)FS.Read("carrello2");
  DataGrid1.DataSource=dt;
  DataGrid1.DataBind();
  double tot=Convert.ToDouble(dt.Compute("Sum([prezzo tot])",null));
  totale.InnerText=String.Format("Totale: {0:c}",tot);
  string quale=Request.QueryString["id"];
  if (quale==null) return;

  for (int i=0; i<dt.Rows.Count;i++)
  {
   if (dt.Rows[i][0].ToString().Equals(quale))
   {
     DataGrid1.Items[i].BackColor=Color.AliceBlue;
     break;
   }
  }
}
else
{
  elenco.InnerText="Non hai ancora inserito nulla!";
}

Viene controllata l'esistenza di questo oggetto, se è presente viene utilizzato il DataTable memorizzato per la tabella riassuntiva nella colonna di destra, con l'utilizzo del method "Compute" per calcolare la somma degli articoli presenti.

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC