显示最近查看的项目

本文关键字:项目 最近 显示 | 更新日期: 2023-09-27 18:25:49

我有一个产品表,里面有很多产品。我的家庭控制器中有一个详细信息操作方法,该方法在详细信息视图页面中返回产品详细信息。

假设:我有以下数据:

ProductID | ProductName | Price | CategoryId
    1     |  T-Shirt    |  120  |  Clothing
    2     |   Shirt     |  150  |  Clothing
    3     |   Watch     |  220  |  Watches
    4     |  Laptop     |  820  |  Computing
    5     | Samsung S6  |  520  |  Mobile
    6     |    Xbox     |  320  |  Gaming

现在,我想要的是,如果某些用户访问 T 恤,那么我想将该 T 恤产品添加到"最近查看"的新<div>中。如果他再次访问"手表",请在"最近查看"<div>中添加手表产品。

我也想根据他最近查看的产品展示更多产品。我的意思是,如果他正在访问Xbox,那么Xbox将被添加到最近查看的<div>中,并且与"游戏"类别相关的更多产品将显示在最近查看<div>下方的新<div>中。

这是我正在尝试的,我的想法是将产品 Id 存储在 cookie 和详细信息视图页面中,获取 Cookie 请求,获取 cookie 的产品 ID 并找到该产品的类别并显示该类别中的更多产品。

首页控制器

public ActionResult Details(int? id)
    {
        if (id == null)
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        Product product = db.Products.Find(id);
        if (product == null)
            return HttpNotFound();
        //Creating cookies
        HttpCookie _userActivity = new HttpCookie("UserActivity");
        _userActivity["ProductID"] = id.ToString();
        _userActivity["ProdutName"] = product.Name;
        _userActivity["Lastvisited"] = DateTime.Now.ToShortTimeString();
        //Adding Expire Time of cookies
        _userActivity.Expires = DateTime.Now.AddDays(5);
        //Adding cookies to current web response
        Response.Cookies.Add(_userActivity);
        //Reading cookies
        HttpCookie readcookie = Request.Cookies["UserActivity"];
        string productID , productName, lastVisited ;
        if (readcookie != null)
        {
            productID = readcookie["ProductID"];
            productName = readcookie["ProdutName"];
            lastVisited = readcookie["Lastvisited"];
        }
        return View(product);
    }

我在我的详细信息视图页面中写了这个。它向我显示最近查看产品的 ID 和详细信息,但只有 1 个来自 cookie 的产品详细信息。不像我看到的那样

<div class="row">
        <div class="col-sm-9">
            @{
                var product = Request.Cookies["UserActivity"].Values;
            }
            <p>@product</p>
            <br />
            <h2>@Html.DisplayFor(model => model.Name)</h2>
 </div>

显示最近查看的项目

首先,您应该创建一些类来保存您最近的产品信息:

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

也许在加载时或在登录事件的某个地方用用户持续存在的最近产品列表填充会话["最近产品列表"]。

然后,您有这个函数,根据提供的信息存储最近的产品:

public void AddRecentProduct(List<RecentProduct> list, int id, string name, int maxItems)
{
    // list is current list of RecentProduct objects
    // Check if item already exists
    var item = list.FirstOrDefault(t => t.ProductId == id);
    // TODO: here if item is found, you could do some more coding
    //       to move item to the end of the list, since this is the
    //       last product referenced.
    if (item == null)
    {
        // Add item only if it does not exist
        list.Add(new RecentProduct
        {
            ProductId = id,
            ProdutName = name,
            LastVisited = DateTime.Now,
        });
    }
    // Check that recent product list does not exceed maxItems
    // (items at the top of the list are removed on FIFO basis;
    // first in, first out).
    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();
    // Read list of recent products from session
    var list = Session["RecentProductList"] as List<RecentProduct>;
    if (list == null)
    {
        // If list not found in session, create list and store it in a session
        list = new List<RecentProduct>();
        Session["RecentProductList"] = list;
    }
    // Add product to recent list (make list contain max 10 items; change if you like)
    AddRecentProduct(list, id.Value, product.Name, 10);
    // Store recentProductList to ViewData keyed as "RecentProductList" to use it in a view
    ViewData["RecentProductList"] = list;
    return View(product);
}

然后在视图中从 ViewData 字典中读取数据并显示最近产品的列表:

<div class="row">
    <div class="col-sm-9">
        @{
            var recentProductList = ViewData["RecentProductList"] as List<RecentProduct>;
        }
        @* Do whatever you like with recentProductList here (e.g. display its data) *@
        @foreach (var recentProduct in recentProductList)
        {
            <p>@recentProduct.ProdutName (id: @recentProduct.ProductId)</p>
        }
        <br />
        <h2>@Html.DisplayFor(model => model.Name)</h2>
    </div>
</div>

当然,此代码示例缺少一些 null 检查和其他内容,但它应该让您大致了解如何使用此功能。