如何计算用户的视图?

时间:2012-08-31 13:03:42

标签: asp.net-mvc-3

我想要计算用户观看产品的次数。

产品具有整数类型的 ViewCount 属性,在详细信息视图中,我增加 ViewCount

public ActionResult Details( int id )
  {
    ...
    product.ViewCount = product.ViewCount + 1;
    db.SaveChanges();
    return View( product );
  }

但是在每次刷新时,ViewCount都会增加。

我应该怎么做,ViewCount在每个用户会话中增加1次?

或者其他方式,正确的标签,任何链接,请。

5 个答案:

答案 0 :(得分:6)

您可以使用Cookie。

var productId = 1;


if (Request.Cookies["ViewedPage"] != null)
{
    if (Request.Cookies["ViewedPage"][string.Format("pId_{0}",productId )] == null)
    {
        HttpCookie cookie = (HttpCookie)Request.Cookies["ViewedPage"];
        cookie[string.Format("pId_{0}",productId )] = "1";
        cookie.Expires = DateTime.Now.AddDays(1);
        Response.Cookies.Add(cookie); 

        db.Execute("UPDATE Products SET ViewCount = ViewCount + 1 WHERE ProductId = @id", new { id = productId } ); 
        db.SaveChanges();
    }
}
else
{
    HttpCookie cookie = new HttpCookie("ViewedPage");
    cookie[string.Format("pId_{0}",productId )] = "1";
    cookie.Expires = DateTime.Now.AddDays(1);
    Response.Cookies.Add(cookie); 

    db.Execute("UPDATE Products SET ViewCount = ViewCount + 1 WHERE ProductId = @id", new { id = productId } ); 
    db.SaveChanges();
}

答案 1 :(得分:3)

我建议你创建一些动作过滤器来跟踪它。

public class TrackFilter: IResultFilter
{
  public void OnResultExecuting(ResultExecutingContext filterContext)
  {

  }

  public void OnResultExecuted(ResultExecutedContext filterContext)
  {
    // do a database call and update the count
  }
}

[Track]
public ActionResult Details(int id)
{
}

您也可以参考此thread了解更多信息。

答案 2 :(得分:2)

您的代码不是线程安全的:如果两个用户同时访问该页面,则ViewCount将增加1而不是2(因为该值由DB使用者而不是DB本身递增)。您可以通过直接运行SQL UPDATE Products SET ViewCount = ViewCount + 1 WHERE ProductId = @id来解决此问题。您的DBMS将提供并发保护。

无论如何,为防止视图计数在同一会话中被其他视图递增,只需使用存储在会话中的哈希集,如下所示:

public ActionResult Details(Int32 id ) {

    HashSet<Int32> productsSeen = (HashSet<Int32>)Session["ProductsSeen"];
    if( productsSeen == null ) {
        Session["ProductsSeen"] = productsSeen = new HashSet<Int32>();
    }

    if( !productsSeen.Contains( id ) ) {

        db.Execute("UPDATE Products SET ViewCount = ViewCount + 1 WHERE ProductId = @id", new { id = id } ); // psuedocode. This isn't a real EF construct.
        db.SaveChanges();
    }

    return View( product );
}

答案 3 :(得分:0)

model.ViewCount = model.ViewCount + 1;

_context.Entry(model);

_context.SaveChanges();

return View(model);

答案 4 :(得分:0)

这是改进的戴码。您必须添加productsSeen.Add(id);在第二个if statment

<a target="_blank" ng-href="{{ section.myLink.LinkHref }}">
<img data-ng-src="{{icon.source}}" alt="{{section.myLink.LinkText}}"/>
</a>