2015-04-20 86 views
2

我正在嘗試創建一個存儲用戶查看的屬性列表的cookie。最近瀏覽過的Cookie

我創建了一個測試,它的工作部分。目前,每次我訪問一個頁面時,它都會從URL中提取屬性ID,並創建一個包含該URL的新字符串,如果cookie已經存在,它會將該屬性ID附加到該頁面上。

@{ 
    var rPropertyId = UrlData[0].AsInt(); 

    if(rPropertyId > 0){ 
     if (Request.Cookies["viewed_properties"] != null){ 
      var value = Request.Cookies["viewed_properties"].Value.ToString(); 
      var value1 = value + "." + rPropertyId; 
      var newcookievalue = String.Join(".", value1.Split(new Char[] {'.'}).Distinct()); 
      Response.Cookies["viewed_properties"].Value = newcookievalue; 
      Response.Cookies["viewed_properties"].Expires = DateTime.Now.AddYears(1); 
     } else { 
      Response.Cookies["viewed_properties"].Value = rPropertyId.ToString(); 
      Response.Cookies["viewed_properties"].Expires = DateTime.Now.AddYears(1);    
     } 
    } 
} 

@if (Request.Cookies["viewed_properties"] != null){ 
    var mylist = Request.Cookies["viewed_properties"].Value.Split(new Char[] {'.'}); 
    foreach (var i in mylist) 
    { 
     <p>@i</p> 
    } 
} 

這個過程不會採取什麼樣的考慮是,如果用戶訪問相同的屬性不止一次,我還是想在cookie中只有1個是ID的條目。我將如何檢查這個,將其轉換爲數組?

回答

2

Enumerable.Distinct將確保您沒有重複。

喜歡的東西:

var newCookieValue = 
     String.Join(".",   
      currentCookieValue.Split(new Char[] {'.'}).Distinct()); 

爲最新添加到末尾 - 一種選擇是除去第一和以後添加:

.... 
    currentCookieValue.Split(new Char[] {'.'}) 
     .Where(s => s != newStringValueToAdd) 
     .Distinct() 
     .ToList() 
     .Add(newStringValueToAdd) 

邊注:cookie的值具有相對小的長度限制(What is the maximum size of a web browser's cookie's key? ),所以要小心添加任意數量的項目到單個cookie。

+0

好吧,所以添加「獨特」功能可以確保沒有重複,這很好。但是,如果它找到重複的,它不會將明確的條目添加到列表的末尾? – Gavin5511

+0

例如,如果我瀏覽屬性1,然後屬性2,然後屬性3,然後屬性1再次,我希望「1」在列表的末尾?這是否有超載? – Gavin5511

+0

@ Gavin5511沒有超載,你必須刪除/添加你的自我(添加示例)。 –