2014-11-24 31 views
0

我試圖從一個特定的會話變量中讀取一個名爲'cart'的數據。但是,當我執行下面的方法時,輸出字符串如下System.Collections.Generic.List 1 [System.String]`,而我的願望目標是檢索產品ID數據值(會話'cart')。如何從會話變量中調用數據?

protected void AddToCart_Click(object sender, EventArgs e) 
    { 
     var selectedProducts = GridView1.Rows.Cast<GridViewRow>() 
      .Where(row => ((CheckBox)row.FindControl("SelectedProducts")).Checked) 
      .Select(row => GridView1.DataKeys[row.RowIndex].Value.ToString()).ToList(); 
     if (Session["Cart"] == null) 
     { 
      Session["Cart"] = selectedProducts; 

     } 
     else 
     { 
      List<String> cart = new List<String>(); 
      cart = (List<string>)Session["Cart"]; 

      foreach (var product in selectedProducts) 
       cart.Add(product); 
      Session["Cart"] = cart; 
     } 
     foreach (GridViewRow row in GridView1.Rows) 
     { 
      CheckBox cb = (CheckBox)row.FindControl("SelectedProducts"); 
      if (cb.Checked) 
       cb.Checked = true; 

       { 

        // string data = (string)Session["Cart"]; 
        List<string> cart = (List<string>)Session["Cart"]; 
        Label1.Text = cart.ToString(); 
       }    
     } 
    } 

任何進一步的建議,至於我哪裏可能會出錯,將不勝感激。
非常感謝。

+0

由於String沒有「產品ID值」,因此您可能會錯誤地將「」列表存儲在'Session'中,但這是另一個問題。即'.Select(row => GridView1.DataKeys [row.RowIndex] .Value.ToString())。ToList()'不是你想要的。 – 2014-11-24 16:30:48

回答

1

List<T>.ToString()具有以下默認的實現:

public virtual String ToString() 
{ 
    return GetType().ToString(); 
} 

你需要通過重寫是(在派生類,當然),如果你想在你所描述的方式使用ToString()提供自己的實現。

編輯:假設你沒有使用ToString()還有其他幾個選項。使用LINQ可以彙總列表,像這樣:

cart.Aggregate(String.Empty, (a, b) => a + ", " + b); 

或者你也可以把它變成一個Array和使用String.Join()(瑞克建議),也可以實現對IEnumerable<String>的擴展方法或任何適合你的目的。

+0

正確的根本原因,正確的主意,但說「覆蓋」不清楚。您只能通過創建新類型來覆蓋。在這種情況下更好的方法是創建一個幫助程序方法,它需要一個'IList '並以字符串的形式創建所需的標記。 – Richard 2014-11-24 15:52:22