2014-11-22 34 views
-4

試圖建立一個(非常)簡單的購物車。我使用Sessions在PHP中完成了這項工作,我可以告訴它與ASP Sessions有點不同。對於初學者來說,PHP會話只是服務器端的cookie。在ASP C#中,我發現他們在關閉應用程序時重置自己。然而這對我正在嘗試做的事很好。但是我遇到了一個障礙,因爲我無法弄清楚如何創建一個可以隨時添加的動態會話。ASP C#動態會話

什麼莫名其妙的我的是,如果我這樣做只是這有一個cookie,這將是很大的不同:

     <a href="@Url.Action("TestSession", "Products")" class="AddLink"><button class="btn btn-default"> Add to Cart </button></a>  
         <a href="@Url.Action("TestSession2", "Products")" class="AddLink"><button class="btn btn-default"> Add to Cart </button></a>  

public ActionResult TestSession() 
    { 
     List<int> ids = new List<int> { 1, 2, 3, 4, 5 }; 
     Session["myIds"] = ids; 

     return RedirectToAction("Index"); 
    } 

    public ActionResult TestSession2() 
    { 
     List<int> ids = new List<int> { 11, 12, 13, 14, 15 }; 
     Session["myIds"] = ids; 

     return RedirectToAction("Index"); 
    } 

現在我在我的MVC視圖一個簡單的標籤測試這些

使我感到困惑的一點是,當我調試時,Session [「myIds」]只保留它所點擊的值。如果我點擊第一個,那麼myIds將是1,2,3,4,5,如果我點擊第二個,那麼它會刪除第一個,並確定11,12,13,14,15 ..這是完全的與PHP會話相反。現在,如果我用ASP cookie做了這個(不知道我是否可以插入一個List到一個cookie),那麼它會堅持下去。

所以我的問題是如何創建一個會話,我可以簡單地添加到但不刪除之前的值?我確實試圖創建一個全球會議,但不太明白如何做到這一點。

回答

1

會話只是一本字典。你沒有創建一個新的會話(沒有動態會話這樣的事情)。當你做Session["myIds"] = ids;時,你正在字典中創建一個新的密鑰(如果它不存在)並將值設置爲ids。如果密鑰已存在於字典中,則覆蓋該值。這就是爲什麼你會看到你所看到的行爲。

如果你想要的元素添加到存儲在會話中的現有列表,它會是這樣的:在ASP.NET

if (Session["myIds"] as List<int> != null) 
{ 
    (Session["myIds"] as List<int>).AddRange(ids); 
} 
else 
{ 
    Session["myIds"] = ids; 
} 
+0

AH!好的謝謝!很好的答案。但這是一個動態會議,不是嗎?無論哪種方式,謝謝很多人! – 2014-11-22 19:17:31

+1

不,正如我所說的那樣,「動態會話」不存在。每個[session](http://msdn.microsoft.com/en-us/library/ms178581(v = vs.100).aspx)都有一個Session對象。會話狀態存儲在服務器內存中(或者可以爲數據庫配置),並且由於包含會話ID的Cookie,服務器知道哪個會話屬於哪個連接(或者,如果啓用了無Cookie會話,則它會存儲會話ID在URL中)。 – mason 2014-11-22 19:19:52

+0

是的,但動態只是意味着它不是靜態的,並且通過執行你的方法,這就是動態定義,因爲我們在聲明之後添加它。 – 2014-11-22 19:21:33

1

會議是簡單的字典 - key-value存儲。 那麼你在做什麼只是用新的價值來重寫價值。 而是壓倒一切的,你可以簡單地做這樣的事情:

 public ActionResult TestSession() 
    { 
     List<int> ids = new List<int> { 1, 2, 3, 4, 5 }; 
     if (Session["myIds"] as List<int> != null) 
     { 
      (Session["myIds"] as List<int>).AddRange(ids); 
     } 
     else 
     { 
      Session["myIds"] = ids; 
     } 

     return RedirectToAction("Index"); 
    } 

    public ActionResult TestSession2() 
    { 
     List<int> ids = new List<int> { 11, 12, 13, 14, 15 }; 
     if (Session["myIds"] as List<int> != null) 
     { 
      (Session["myIds"] as List<int>).AddRange(ids); 
     } 
     else 
     { 
      Session["myIds"] = ids; 
     } 
     return RedirectToAction("Index"); 
    } 

你必須首先檢查是否Session["myIds"]是你期待什麼(List<int>)並且不爲空,那麼你只需要你的ID添加到列表。

我建議閱讀關於C# collections

+0

是的,第一個人說這已經是我必須把它給他,但upvoting你的答案,並感謝收藏參考。將研究這一點。 – 2014-11-22 19:19:43