我想要计算用户观看产品的次数。
产品具有整数类型的 ViewCount 属性,在详细信息视图中,我增加 ViewCount :
public ActionResult Details( int id )
{
...
product.ViewCount = product.ViewCount + 1;
db.SaveChanges();
return View( product );
}
但是在每次刷新时,ViewCount都会增加。
我应该怎么做,ViewCount在每个用户会话中增加1次?
或者其他方式,正确的标签,任何链接,请。
答案 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>