我试图展示最近浏览过的产品,到目前为止我已经做过了。我有一个Product
表,其中存储了许多产品。我的HomeController
有一个Details()
的Action方法,用于显示产品详细信息。
我写了AddRecentProduct
方法,在Session
现在我想将这些最近查看过的产品列表存储到访问者计算机上至少30天的cookie中,因为会话过期了。就像最近观看的Imdb一样。
此外,如果我在数据库RecentlyViewed
中创建另一个包含rv_id, userId, productId
列的表,我将如何在其中保存recentViewedList数据? 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);
}
ProductDetails查看页面
<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>
我通过会话得到了理想的结果,现在我想用cookies做同样的事情。
这就是我正在尝试创建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);
和 ProductDetails查看页面读取这样的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和值?
答案 0 :(得分:0)
最适合您的解决方案是使用Html5 Web Storage。它允许您在本地浏览器中存储最多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。
答案 1 :(得分:-1)
如果您使用的是cookies,为什么还需要RecentViewed表呢?在cookie中存储最近的产品ID对登录和匿名用户都有效。