0

ユーザーが非表示にするためにクリックした行を除外するビューを返そうとしています。ユーザーが非表示にしたい行の情報を格納する Cookie が生成されます。

私の問題は、Cookie に含まれる値が 1 つだけであるため、select ステートメントで一度に 1 つの行しか除外されないことです。ここに私が持っているものがあります:

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、または少なくとも各ユーザーに1つのCookieのみを送信するようにSessionオブジェクトを使用することを検討しましたか?)ただし、このアプローチを使用すると、実行できるようです。 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 に答える