0

我正在尝试返回一个视图,该视图排除了用户单击隐藏的行,并生成了一个 cookie,存储用户希望隐藏哪些行的信息。

我的问题是 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());
     }

我尝试创建一个字符串并继续向字符串附加新值,但它仍然只需要最后一次单击的值。

4

1 回答 1

0

我不认为 cookie 是执行此操作的最佳方法(您是否考虑过使用 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());
 }
于 2012-04-24T22:05:34.193 回答