0

我試圖返回排除行的用戶點擊了隱藏到一個視圖,並生成一個cookie存儲該行的用戶希望隱藏的信息。從cookie獲取信息隱藏從一個GridView行中MVC3

我的問題是該Cookie只包含一個值,所以我的select語句一次只能排除一行。下面是我有:

public ActionResult Hide(int id) 
    { 
     HttpCookie cookie = new HttpCookie("HideCookie"); 
     cookie.Value = id.ToString(); 
     cookie.Expires = DateTime.Now.AddYears(1); 
     System.Web.HttpContext.Current.Response.Cookies.Add(cookie); 

     int i = Convert.ToInt32(Request.Cookies.Get("HideCookie").Value); 
     var quotes = from q in db.View1 where !q.Quote_ID.Equals(i) select q; 

     return View(quotes.ToList()); 
    } 

我試圖創建一個字符串,並不斷追加新值字符串,但它仍然只需要最後一個值點擊。

回答

0

我不賣餅乾是最好的方法(你有沒有考慮過使用TempData,或者至少是Session對象,這樣你只發送一個cookie給每個用戶?)雖然使用這種方法,但它似乎你可以通過使用cookie對象的逗號分隔列表來做到這一點。

public ActionResult Hide(int id) 
{ 
    var cookie = Request.Cookies.Get("HideCookie"); 
    List<string> hideItems; 
    if (cookie == null) 
    { 
     cookie = new HttpCookie("HideCookie"); 
     hideItems = new List<string>() { id.ToString() }; 
     cookie.Value = id.ToString(); 
     cookie.Expires = DateTime.Now.AddYears(1); 
     System.Web.HttpContext.Current.Response.Cookies.Add(cookie); 
    } 
    else 
    { 
     cookie = Request.Cookies.Get("HideCookie"); 
     hideItems = cookie.Value.Split(',').ToList(); 
     hideItems.Add(id.ToString()); 
     cookie.Value = string.Join(",", hideItems); 
    } 

    var quotes = from q in db.View1 where 
     !hideItems.Select(i=>int.Parse(i)).Contains(q.Quote_ID) select q; 

    return View(quotes.ToList()); 
} 
+0

感謝您的答覆。這項任務需要我使用cookies來隱藏,所以我沒有選擇。我不得不改變分割和連接方法來讓語法工作。 hideItems = cookie.Value.Split(',')。ToList(); cookie.Value = string.Join(「,」,hideItems.ToArray()); 雖然hideItems是一個字符串,Quote_ID是int並且不能比較,但我無法獲得視圖來返回。我得到「LINQ to Entities不能識別方法System.String ToString()'的方法,並且此方法不能被轉換成存儲表達式。」當我嘗試使用它的ToString方法 – user1354780 2012-04-24 23:42:17

+0

@ user1354780啊正確...請參閱更新。在進行比較之前,您可以將列表轉換爲列表。 – McGarnagle 2012-04-24 23:44:54

+0

看起來我在那裏有更多的錯別字(在string.join和string.split中)。現在應該是固定...看起來我需要更多的咖啡:-( – McGarnagle 2012-04-24 23:47:15