Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Session διαρκείας...

Îåêßíçóå áðü ôï ìÝëïò SnakeEyes. Τελευταία δημοσίευση από το μέλος zeon στις 13-04-2006, 11:20. Υπάρχουν 13 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  11-04-2006, 12:50 11777

    Session διαρκείας...

    Καλησπέρα,
    έχω δυό σελίδες που από τη πρώτη στέλνω τα δεδομένα στην δεύτερη και στη δεύτερη τα κρατάω σε ένα session(στο session μπαίνει ένα shopping cart), όταν όμως γυρνάω στη πρώτη και στέλνω κάτι καινούριο στο session αποθηκεύονται μόνο τα κανούρια δεδομένα, ο κώδικας πιστεύω είναι σωστός γιατί όταν όλα γινόντουσαν στη ίδια σελίδα το session λειτουργούσε κανονικά.οι αλλάγές που έκανα στο κώδικα για να τον σπάσω σε δυο σελίδες δεν νομίζω ότι επηρέασαν κάτι, μάλλον κάποια παράμετρο πρέπει να βάλω στο session για να παραμένει,
    έχει κανείς να προτείνει κάτι?
    "...κάπου μακριά οι άνθρωποι θα νομίζουν πως είναι ακόμα ζωντανοί..."
  •  11-04-2006, 13:34 11778 σε απάντηση της 11777

    Απ: Session διαρκείας...

    Στην καινούρια σελίδα απλά αναθέτεις μια καινούρια τιμή στο Session; αν ναι, τότε λογικό είναι να μην κρατάει τα παλιά. Θα σε συμβούλευα να βάζεις στο Session ένα 'collection-oriented' object (συγχωρέστε με για τον αδόκιμο όρο :-) ) και απλά όταν το session είναι null, να το δημιουργείς, και όταν δεν είναι, τότε να κάνεις add items σε αυτό.

    ελπίζω να σε βοήθησα :-)
    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
  •  11-04-2006, 17:15 11784 σε απάντηση της 11777

    Απ: Session διαρκείας...

    Στην καινουρια σελίδα ελέγχω αν υπάρχει το session και αν υπάρχει παίρνω τα δεδομένα του, προσθέτω τα καινούρια και το ξανααποθηκεύω. το πρόβλημα είναι πως το προηγούμενo session δεν παραμένεί ώστε να διαβαστεί και έτσι κάθε φορά φτιάχνεται καινούρια.
    "...κάπου μακριά οι άνθρωποι θα νομίζουν πως είναι ακόμα ζωντανοί..."
  •  12-04-2006, 09:09 11809 σε απάντηση της 11777

    Απ: Session διαρκείας...

    Γεια χαρά. Θα μπορούσες να παραθέσεις το κομμάτι του web.config file σου που αφορά στο session, καθώς και τον κώδικα που αφορά στο session στις 2 σελίδες σου?

    (Επίσης δοκίμασε να αντικαταστήσεις το Session state με Αpplication state να δεις τι γίνεται σε αυτή την περίπτωση)

  •  12-04-2006, 11:01 11815 σε απάντηση της 11809

    Απ: Session διαρκείας...

    Φυσικά, ορίστε:

    web.config
    <?xml version="1.0"?>
    <configuration>
    <appSettings/>
    <connectionStrings>
    <add name="productsConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\products.mdf;Integrated Security=True;User Instance=True"
    providerName="System.Data.SqlClient" />
    </connectionStrings>
    <system.web>
    <compilation debug="true" strict="false" explicit="true"/>
    <pages>
    <namespaces>
    <clear/>
    <add namespace="System"/>
    <add namespace="System.Collections"/>
    <add namespace="System.Collections.Specialized"/>
    <add namespace="System.Configuration"/>
    <add namespace="System.Text"/>
    <add namespace="System.Text.RegularExpressions"/>
    <add namespace="System.Web"/>
    <add namespace="System.Web.Caching"/>
    <add namespace="System.Web.SessionState"/>
    <add namespace="System.Web.Security"/>
    <add namespace="System.Web.Profile"/>
    <add namespace="System.Web.UI"/>
    <add namespace="System.Web.UI.WebControls"/>
    <add namespace="System.Web.UI.WebControls.WebParts"/>
    <add namespace="System.Web.UI.HtmlControls"/>
    </namespaces>
    </pages>
    <authentication mode="Windows"/>
    </system.web>
    </configuration>


    cart.aspx
    <%@ Page debug="true" Language="VB" ContentType="text/html" ResponseEncoding="iso-8859-7"%>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">

    <head runat="server">

    <title>Καλάθι</title>


    <script runat="server">

    Dim objDT As System.Data.DataTable

    Dim objDR As System.Data.DataRow

    Private Sub Page_Load(s As Object, e As EventArgs) Handles MyBase.Load

    If Not IsPostBack Then

    makeCart()

    End If

    End Sub

    Function makeCart()

    objDT = New System.Data.DataTable("Cart")

    objDT.Columns.Add("ID", GetType(Integer))

    objDT.Columns("ID").AutoIncrement = True

    objDT.Columns("ID").AutoIncrementSeed = 1

    objDT.Columns.Add("Quantity", GetType(Integer))

    objDT.Columns.Add("Product", GetType(String))

    objDT.Columns.Add("Cost", GetType(Decimal))

    Session("Cart") = objDT


    End Function

    Sub AddToCart(s As Object,e As EventArgs) Handles MyBase.Load


    objDT = Session("Cart")

    Dim Product As String = Request.QueryString("name")

    Dim Cost As Decimal = Request.QueryString("value")

    Dim blnMatch As Boolean = False


    For Each objDR In objDT.Rows

    If objDR("Product") = Product Then

    objDR("Quantity") += 1

    blnMatch = True

    Exit For

    End If

    Next


    If Not blnMatch Then

    objDR = objDT.NewRow

    objDR("Quantity") = 1

    objDR("Product") = Product

    objDR("Cost") = Cost 'Decimal.Parse(Cost)

    objDT.Rows.Add(objDR)

    End If

    Session("Cart") = objDT

    dg.DataSource = objDT

    dg.DataBind()

    lblTotal.Text = "$" & GetItemTotal()


    End Sub

    Function GetItemTotal() As Decimal

    Dim intCounter As Integer

    Dim decRunningTotal As Decimal

    For intCounter = 0 To objDT.Rows.Count - 1

    objDR = objDT.Rows(intCounter)

    decRunningTotal += (objDR("Cost") * objDR("Quantity"))

    Next

    Return decRunningTotal

    End Function


    Sub Delete_Item(s As Object,e As DataGridCommandEventArgs)


    objDT = Session("Cart")

    objDT.Rows(e.Item.ItemIndex).Delete()

    Session("cart") = objDT


    dg.DataSource = objDT

    dg.DataBind()

    lblTotal.Text = "$" & GetItemTotal()

    End Sub


    </script>


    </head>

    <body>

    <form id="form1" runat="server">

    <div>


    <asp:DataGrid ID="dg" runat="server" OnDeleteCommand="Delete_item">

    <columns>

    <asp:buttoncolumn ButtonType="Linkbutton" CommandName="delete" Text="remove item" />

    </columns>

    </asp:DataGrid>

    <br />

    <br />

    Total:

    <asp:Label ID="lblTotal" runat="server" />

    <a href="Default.aspx">

    <br />

    Default.aspx</div>

    </form>

    </body>

    </html>


    Αυτό είναι ένα καλάθι που βρήκα στο ίντερνετ και με λίγες τροποποίησεις μπορεί να το φέρει ο καθένας στα μέτρα του.
    Από την σελίδα default.aspx στέλνονται τα δεδομένα στη σελίδα cart.aspx, το πρόβλημα είναι ότι όταν γυρνάω πίσω στην default.aspx και στέλνω κάτι καινούριο τότε στο καλάθι μπαίνει μόνο το καινούριο προϊόν,προφανώς για κάποιο λόγο όταν φεύγω από τη σελίδα το session διαγράφεται,εγώ θέλω να μην διαγράφεται έτσι ώστε όταν ξανατρέχει η σελίδα απλά να προστήθεται το καινούριο προϊόν στο καλάθι.
    Υ.Γ. αυτό με το application δεν ξέρω πως γίνεται, είχα δοκιμάσει να αντικαταστήσω όπου session->application αλλά το ίδιο αποτέλεσμα είχα.

    "...κάπου μακριά οι άνθρωποι θα νομίζουν πως είναι ακόμα ζωντανοί..."
  •  12-04-2006, 14:36 11822 σε απάντηση της 11777

    Απ: Session διαρκείας...

    Συγγνώμη που θα σου απαντήσω λίγο στα γρήγορα αλλά δεν έχω πολύ χρόνο. Στη σελίδα σου κάθε φορά που μπαίνεις καλείς την "makeCart", εκεί έχεις το "Session("cart") = objD" (αν κατάλαβα καλά το Session("Cart") κρατάει τα προιόντα) "ξανααλλάζει" τιμή άσχετα αν είχες κάτι από πριν ή όχι στο καλάθι σου. Εκεί νομίζω με μια γρήγορη ματιά εντοπίζεται το πρόβλημα.

    Θα σε συμβούλευα να βάζεις στο Session ένα 'collection-oriented' object (συγχωρέστε με για τον αδόκιμο όρο :-) ) και απλά όταν το session είναι null, να το δημιουργείς, και όταν δεν είναι, τότε να κάνεις add items σε αυτό.

    Νομίζω ότι αυτό σου "λείπει", εξέτασε αν υπάρχει κάτι και αν ναι πρόσθεσε τις καινούριες τιμές.

    Εναλλακτικά (για μια απλή μορφή) μπορείς να κρατάς στο Session("cart") τα ids των προιόντων που βάζεις στο καλάθι με μορφή string με διαχωριστικό. Κάθε φορά προσθέτεις ένα. Στο τέλος με τη split βρίσκεις τα επιμέρους.

     

    If IsNothing(Session("Cart")) Then

       Session("Cart") = productId.ToString

    Else

       Session("Cart") = Session("Cart").ToString & "," & productId.ToString

    End If

     

    Dim x As String()

    x = Session("Cart").ToString.Split(",")

    Το "x" σου περιέχει τα ids των προιόντων που βρίσκονται στο καλάθι.

  •  12-04-2006, 15:19 11825 σε απάντηση της 11777

    Απ: Session διαρκείας...

    οχι,αν προσέξεις τον κώδικα ελέγχει αν υπάρχει το cart η όχι, όταν τρέχαν όλα σε μια σελίδα δουλευε κανονικά.
    "...κάπου μακριά οι άνθρωποι θα νομίζουν πως είναι ακόμα ζωντανοί..."
  •  12-04-2006, 15:57 11828 σε απάντηση της 11815

    Απ: Session διαρκείας...

    όπως το είδα με μια γρήγορη ματιά, και η Page_Load αλλά και η AddToCart κάνουν handle το load της σελίδας. είσαι σίγουρος πως θες να γίνεται αυτό; μετά, αν η σελίδα δεν είναι postback καλείται η makeCart()  η οποία στο τέλος της κάνει αυτό : Session("Cart") = objDT, όπου το objDT είναι ένα καινούριο dataTable.... οπότε ( αν δεν έχω κάνει κάποιο λάθος στην ανάγνωση του κώδικα) το παλίο session object σου χάνεται και αντικαθίσταται με καινούριο.....
    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
  •  12-04-2006, 16:39 11834 σε απάντηση της 11777

    Απ: Session διαρκείας...

    το handle το προσθεσα εγώ καθώς ήθελα με κάποιο τρόπο να μπορώ να "πιάσω" της τιμές που στέλνω απο τη σελίδα default.aspx, χωρίς αυτό το request.querystring δεν έδινε στις μεταβλητές τις τιμές που ερχόντουσαν. Αν προσέξεις το objDT παίρνει πρώτα το session και το "ενημερώνει" δηλ όσον αφορά αυτό δεν έχω καμία αμφιβολία καθώς σας λέω το κωδικά τον βρήκα έτοιμο και δούλευε και απλά τον τροποποίησα όπου χρειαζόταν, στο σημείο που αναφέρεις δεν πείραξα τίποτα, δεν ξέρω το handle που πρόσθεσα αν "πειράζει" κάτι στο κώδικα
    "...κάπου μακριά οι άνθρωποι θα νομίζουν πως είναι ακόμα ζωντανοί..."
  •  12-04-2006, 17:56 11835 σε απάντηση της 11777

    Απ: Session διαρκείας...

    Στο Page_Load εκτελείς την makeCart εφόσον η σελίδα δεν έχει γίνει post back. Αυτό είναι λογικό να δουλεύει όταν ολόκληρη η λογική είναι στην ίδια σελίδα. Στην περίπτωσή σου όμως (που έχεις σπάσει τη σελίδα σε δύο), ενδέχεται να φτάνεις στην αρχική σελίδα χωρίς postback. Βάλε ένα break στην κλήση της makeCart να δεις αν όντως μπαίνει μέσα στο if κάθε φορά κατά το Page_Load. Σε αυτή την περίπτωση θα πρέπει να αλλάξεις ανάλογα τον κώδικά σου...
    Vir prudens non contra ventum mingit
  •  13-04-2006, 10:37 11847 σε απάντηση της 11777

    Απ: Session διαρκείας...

    φίλε έχεις δίκιο,έβαλα break στην makecart και βλέπω ότι εκτελείται κάθε φορά, όχι μόνο στην πρώτη φόρτωση της σελίδας. μπορώ να αντικαταστήσω με κάτι άλλο την postback ώστε η makecart να εκτελείται μόνο κατά την πρώτη φόρτωση?
    "...κάπου μακριά οι άνθρωποι θα νομίζουν πως είναι ακόμα ζωντανοί..."
  •  13-04-2006, 10:46 11848 σε απάντηση της 11847

    Απ: Session διαρκείας...

    Βάλε έναν ακόμη έλεγχο μέσα στο If του Postback

    If IsNothing(Session("Cart")) Then

       makeCart()

    End if

     

  •  13-04-2006, 11:10 11849 σε απάντηση της 11847

    Απ: Session διαρκείας...

    Παιδιά ευχαριστώ πολύ το κατάφερα,

    zeon έφτιαξα και ένα δευτερο session και δούλεψε, τώρα όμως που βλέπω τον κώδικά σου, απλοποιεί ακόμα περισσότερο τα πράγματα οπότε θα τον χρησιμοποιήσω.

    Ωραίο forum και πάλι ευχαριστω Smile [:)]

    "...κάπου μακριά οι άνθρωποι θα νομίζουν πως είναι ακόμα ζωντανοί..."
  •  13-04-2006, 11:20 11850 σε απάντηση της 11849

    Απ: Session διαρκείας...

    Τίποτα. Απλά πρόσεξε αν χρησιμοποιήσεις αυτό με τα "ids" μήπως πρέπει να κρατάς και άλλα πράγματα για παράδειγμα το quantiy. Δεν είναι απαραίτητο ότι κάποιος θα παραγγείλει μία φορά κάτι, όπως επίσης ότι και δεν θα αλλάξει η τιμή του όσο αυτός σερφάρει στο shopping cart σου.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems