创建并读取列表<>;来自cookie

本文关键字:来自 cookie gt lt 读取 列表 创建 | 更新日期: 2023-09-27 18:25:58

我正在尝试显示最近查看的产品,到目前为止我已经做到了。我有一个Product表,其中存储了许多产品。我有一个HomeController,它有一个显示产品详细信息的Details()的Action方法。

我已经编写了AddRecentProduct方法,它将最近查看的产品(10)存储在Session

现在我想将这些最近查看的产品列表存储在访问者计算机上的cookie中至少30天,因为会话过期。就像Imdb最近查看的一样。

此外,如果我在数据库RecentlyViewed中创建另一个列为rv_id, userId, productId的表,我将如何在其中保存最近的ViewedList数据?userId列将保存loggedIn用户的id,但如果用户是Guest(未注册),那么解决方案是什么?那么我需要使用GUID吗?

RecentProduct.cs

public class RecentProduct
{
    public int ProductId { get; set; }
    public string ProdutName { get; set; }
    public string ImageUrl { get; set; }
    public DateTime LastVisited { get; set; }
}

控制器

    public void AddRecentProduct(List<RecentProduct> list, int id, string name, int maxItems)
    {
        var item = recentProductList.FirstOrDefault(t => t.ProductId == id);
        if (item == null)
        {
            list.Add(new RecentProduct
            {
                ProductId = id,
                ProdutName = name,
                LastVisited = DateTime.Now,
            });
        }
        while (list.Count > maxItems)
        {
            list.RemoveAt(0);
        }
    }
    public ActionResult Details(int? id)
    {
        if (id == null)
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        Product product = db.Products.Find(id);
        if (product == null)
            return HttpNotFound();
        var list = Session["RecentProductList"] as List<RecentProduct>;
        if (list == null)
        {
            list = new List<RecentProduct>();
            Session["RecentProductList"] = list;
        }
        AddRecentProduct(list, id.Value, product.Name, 10);
        ViewData["RecentProductList"] = list;
        return View(product);
    }

产品详细信息查看页面

<div class="col-sm-9">
            @{
                var recentProductList = ViewData["RecentProductList"] as List<Project.Models.RecentProduct>;
            }
            @foreach (var recentProduct in recentProductList)
            {
                <p>@recentProduct.ProdutName (id: @recentProduct.ProductId)        </p>
            }
        </div>

我在会话中得到了想要的结果,现在我想用cookie做同样的事情。

这就是我正在尝试的创建cookie:

List<RecentProduct> yourList = new List<RecentProduct>();
        RecentProduct rc = new RecentProduct();
        rc.ProdutName = product.Name;
        rc.ProductId = product.ProductId;
        rc.ImageUrl = product.ImagePath;
        rc.LastVisited = DateTime.Now;
        yourList.Add(rc);
        var yourListString = String.Join(",", yourList);
        // Create a cookie
        HttpCookie yourListCookie = new HttpCookie("YourList", yourListString);
        // The cookie will exist for 7 days
        yourListCookie.Expires = DateTime.Now.AddDays(7);
        // Write the Cookie to your Response
        Response.Cookies.Add(yourListCookie);

以及在产品详细信息查看页面中阅读类似以下的cookie:

 @if (Request.Cookies["YourList"] != null)
    {
        // Your cookie exists - grab your value and create your List
        List<string> yourList = Request.Cookies["YourList"].Value.Split(',').Select(x => Convert.ToString(x)).ToList();
        // Use your list here
        <p>@yourList</p>
    }

我没有得到任何结果。如何读取cookie和值?

创建并读取列表<>;来自cookie

对您来说,最好的解决方案是使用Html5 Web存储
它允许您在本地浏览器中存储高达5mb的内容
您只能通过javascript进行读写操作
示例:

    $('#btnLocalStorage').click(function()  
{  
    var txtName = $("#txtName").val();  
    //set item  
    localStorage.setItem("EmpName", txtName);  
});  
$('#btnLocalStorageRemove').click(function()  
 {  
    //remove item  
    localStorage.removeItem("EmpName");  
});  
$('#btnLocalStorageClear').click(function()   
 {  
    //clear Local Storage  
    localStorage.clear();  
});  
$('#btnLocalStorageLength').click(function()   
 {  
    var localStoragelength = localStorage.length;  
    alert("The length of Local storage is " + localStoragelength);  
});  

顺便说一句,它没有过期时间,你也不需要guid。

如果您使用cookie,为什么需要RecentlyViewed表?将最近的产品ID存储在cookie中对登录用户和匿名用户都有效。