2009-07-01 7 views
4

J'ai donc une série de pages de produits et tout ce que je veux faire est de stocker les 5 derniers produits visualisés dans un cookie afin qu'ils puissent être affichés comme historique de site. Le problème que j'ai est n'ajoute pas les cinq éléments initiaux au cookie, c'est quand ils voient 6, 7 ou 10 articles. Quelqu'un at-il des suggestions vraiment décentes sur la façon d'aborder cela?Cinq dernières pages visitées Cookie

Actuellement, j'ai cette logique erronée (j'ai remplacé le nom de cookie (xxx) pour la brièveté);

Dim i As Integer = 0 
     Dim productcount As Integer = 0 

     If HttpContext.Current.Request.Cookies("xxx") Is Nothing Then 
      Dim gingernuts As New HttpCookie("xxx") 
      gingernuts.Values("productcount") = 0 
      gingernuts.Expires = DateTime.Now.AddDays(365) 
      HttpContext.Current.Response.Cookies.Add(gingernuts) 
     End If 

     productcount = HttpContext.Current.Request.Cookies("xxx")("productcount") 

     For i = 0 To productcount 
      If HttpContext.Current.Request.Cookies("xxx")("product" & i & "") = "" Then 
       HttpContext.Current.Response.Cookies("xxx")("product" & i & "") = Request.QueryString("id") 
      Else 
       HttpContext.Current.Response.Cookies("xxx")("product" & i & "") = HttpContext.Current.Request.Cookies("xxx")("product" & i & "") 
      End If 
     Next 

     If productcount = 5 Then 
      HttpContext.Current.Response.Cookies("xxx")("productcount") = 5 
      HttpContext.Current.Response.Cookies("xxx")("product0") = "" 
     Else 
      HttpContext.Current.Response.Cookies("xxx")("productcount") = productcount + 1 
     End If 

Suggestions et critique accueillis et appréciés.

Chris

Répondre

4

Il suffit d'utiliser une valeur simple cookie est une liste délimitée par des virgules des ID de produits les plus récemment consultés. (Notez que mon VB.NET est si fort).

MostRecentIDs as String() '' // Instance level variables 
Const ListSize = 5 

'' // in a method somewhere 
context As HttpContext = HttpContext.Current 
cookie As HttpCookie = context.Request.Cookies("mri") 
mri As Queue(Of String) 

If cookie Is Nothing Then 
    mri = New Queue(Of String)(cookie.Value.Split(",".ToCharArray()) 
Else 
    mri = New Queue(Of String) 
    cookie = New HttpCookie("mri") 
End If 

If mri.Contains(Request.QueryString("id")) Then 

    If mri.Count >= ListSize Then mri.Dequeue() 

    mri.Enqueue(Request.QueryString("id")) 

End If 

MostRecentIDs = mri.ToArray(); 

cookie.Value = String.Join(",", MostRecentIDs) 
cookie.Expires = DateTime.Now.AddDays(365) 

context.Response.Add(cookie) 
  • Maintenant, vous avez accès aux ID de produits les plus récents comme un simple tableau de chaîne.
  • Ce code gère le cas où le cookie n'a pas encore été créé.
  • Le cookie lui-même est beaucoup plus petit.
  • La gestion de la taille de la liste peut facilement être paramétrée.
code

ci-dessus basé sur le code C# testé ci-dessous que je laissai tomber dans un fichier ASPX vide: -

const int listSize = 8; 
string[] _mru; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    HttpCookie cookie = Request.Cookies["mru"]; 
    Queue<string> mru; 
    if (cookie != null) 
    { 
     mru = new Queue<string>(cookie.Value.Split(',')); 
    } 
    else 
    { 
     mru = new Queue<string>(); 
     cookie = new HttpCookie("mru"); 
    } 

    if (!mru.Contains(Request.QueryString["id"])) 
    { 
     if (mru.Count >= listSize) mru.Dequeue(); 

     mru.Enqueue(Request.QueryString["id"]); 
    } 

    _mru = mru.ToArray(); 

    cookie.Value = String.Join(",", _mru); 
    cookie.Expires = DateTime.Now.AddDays(365); 

    Response.Cookies.Add(cookie); 

} 
+0

Bonjour Anthony, Je suis nouveau à apprendre à choisir les structures de données appropriées à un problème. Pouvez-vous expliquer pourquoi vous avez choisi la file d'attente au lieu d'une pile? Quand j'ai lu son problème à l'origine, j'ai pensé que la pile irait mieux car il veut montrer les 5 derniers éléments qu'un utilisateur a visités et une pile est LIFO. – Jon

+1

@Jon, pour une liste des plus récemment utilisés, vous avez besoin d'une structure FIFO. Considérez que si la capacité est atteinte, vous devez sortir le dernier élément de la pile avant d'insérer celui en cours. Cela se traduirait par le fait que les premiers éléments de la pile restent là et que seul le premier élément change une fois que la capacité est atteinte. Ce qui est nécessaire, c'est que l'élément le plus ancien de la liste soit supprimé en premier, c'est-à-dire l'élément inférieur et non le sommet. Supprimer l'élément du bas est d'abord l'action d'une FIFO (une file d'attente) et non d'une LIFO (une pile). – AnthonyWJones

+0

Merci beaucoup pour l'explication! Cela m'a beaucoup aidé, c'est tout à fait logique maintenant. – Jon

1

Voici comment je vais le faire, si je comprends votre question :) droit
Si le nombre de produits est inférieur à 5 append que le nouveau produit. Else remplacer product0 avec product1 jusqu'à 4, puis ajouter de nouveaux produits à 4

If productcount < 5 Then 'Do the null value check before this 
     HttpContext.Current.Response.Cookies("xxx")("productcount") = productCount + 1 
     HttpContext.Current.Response.Cookies("xxx")("product" & productCount + 1) = "" 

    Else 
     For i = 0 To productcount - 1 
      'Replace product 0 with 1, 1 with 2...till 3 with 4 
      HttpContext.Current.Response.Cookies("xxx")("product" & i & "") = HttpContext.Current.Response.Cookies("xxx")("product" & i + 1& "") 

     Next 
     HttpContext.Current.Response.Cookies("xxx")("product" & 4 & "") = Request.QueryString("id") 
    End If 
0

Anthony a répondu à cette question tout à fait, mais pour référence ultérieure et pour ceux qui utilisent VB, c'est le code:

Imports System.Collections.Generic 

    Const listSize As Integer = 5 
    Private _mru As String() 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Dim cookie As HttpCookie = Request.Cookies("mru") 

     Dim mru As Queue(Of String) 
     If cookie IsNot Nothing Then 
      mru = New Queue(Of String)(cookie.Value.Split(","c)) 
     Else 
      mru = New Queue(Of String)() 
      cookie = New HttpCookie("mru") 
     End If 

     If mru.Count >= listSize Then 
      mru.Dequeue() 
     End If 

     mru.Enqueue(Request.QueryString("id")) 

     _mru = mru.ToArray() 

     cookie.Value = [String].Join(",", _mru) 
     cookie.Expires = DateTime.Now.AddDays(365) 


     Response.Cookies.Add(cookie) 
End Sub 

Un grand merci à tous les contributeurs ici aussi.