1

ユーザーが製品を何回視聴したかをカウントしたい。

製品には整数型のViewCountプロパティがあり、詳細ビューでViewCountを増やします。

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

ただし、更新のたびに ViewCount が増加します。

ユーザーのセッションごとにViewCountが1回増加するにはどうすればよいですか?

または別の方法で、右のタグ、任意のリンクをお願いします。

4

5 に答える 5

6

クッキーを使用できます。

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();
}
于 2012-08-31T15:15:51.873 に答える
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)
{
}

詳細については、このスレッドも参照してください。

于 2012-08-31T15:10:51.350 に答える
2

あなたのコードはスレッドセーフではありません: 2 人のユーザーがページに同時にアクセスすると、ViewCount は 2 ではなく 1 ずつ増加します (値は DB 自体ではなく DB コンシューマーによって増加されるため)。これは、SQLUPDATE 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 );
}
于 2012-08-31T13:16:10.760 に答える
0
model.ViewCount = model.ViewCount + 1;

_context.Entry(model);

_context.SaveChanges();

return View(model);
于 2015-03-25T19:34:18.993 に答える
0

これは改善されたDaiコードです。productsSeen.Add( id ); を追加する必要があります。2 番目の if ステートメント

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 ) ) {
        productsSeen.Add( 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 );
}
于 2017-09-23T13:04:08.807 に答える