我正在创建一个拥有母版页的网站。我想创建一个点击计数器来记录访问者的数量,我找到了一个代码并将其放在我的母版页中。代码如下: 标记代码:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="counter.ascx.cs" Inherits="counter" %>
<asp:Label ID="lblCounter" runat="server"></asp:Label>
代码背后 - C#:
protected void Page_Load(object sender, EventArgs e)
{
this.countMe();
DataSet tmpDs = new DataSet();
tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
lblCounter.Text = tmpDs.Tables[0].Rows[0]["hits"].ToString();
}
private void countMe()
{
DataSet tmpDs = new DataSet();
tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
int hits = Int32.Parse(tmpDs.Tables[0].Rows[0]["hits"].ToString());
hits += 1;
tmpDs.Tables[0].Rows[0]["hits"] = hits.ToString();
tmpDs.WriteXml(Server.MapPath("~/counter.xml"));
}
根目录中的xml文件,以使代码正常工作。 XML文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<counter>
<count>
<hits>0</hits>
</count>
</counter>
但是每当我访问它们时,我网站中的每个页面都会触发计数器。请帮我修改此代码,以便一位访问者只触发一次计数器。
我决定只将代码放在索引页面上,但仍然每次刷新和每次舔打开索引(即使停留在索引页面上)都会触发计数器。
答案 0 :(得分:1)
为什么不添加会话?我认为这是XML解决方案最简单的方法,如果将其保存到SQL,则可能涉及更多逻辑。
private void countMe()
{
if(Session["Counted"]==null){
DataSet tmpDs = new DataSet();
tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
int hits = Int32.Parse(tmpDs.Tables[0].Rows[0]["hits"].ToString());
hits += 1;
tmpDs.Tables[0].Rows[0]["hits"] = hits.ToString();
tmpDs.WriteXml(Server.MapPath("~/counter.xml"));
Session["Counted"] = "Yes";
}
}
答案 1 :(得分:0)
您需要检查网页的网址,以便计数器点击代码。试试这样的事情
protected void Page_Load(object sender, EventArgs e)
{
string url = HttpContext.Current.Request.Url.AbsoluteUri;
if(url.Contains("index.aspx")
{
this.countMe();
}
DataSet tmpDs = new DataSet();
tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
lblCounter.Text = tmpDs.Tables[0].Rows[0]["hits"].ToString();
}
答案 2 :(得分:0)
您可以从Global.ascx文件中获取解决方案。 转到应用程序中Golobal.ascx.cs的代码。 在Global.Cs文件中声明一个变量。 并维护Global.ascx.cs文件的'Session_Start'功能中的计数; 写一些公共方法来获取用户数
例如:
protected void Session_Start(Object sender, EventArgs e)
{
totalNumberOfUsers += 1;
currentNumberOfUsers += 1;
}
protected void Session_End(Object sender, EventArgs e)
{
currentNumberOfUsers -= 1;
}
public static int TotalNumberOfUsers
{
get
{
return totalNumberOfUsers;
}
}
public static int CurrentNumberOfUsers
{
get
{
return currentNumberOfUsers;
}
}
答案 3 :(得分:0)
除了在探测器示例中使用“Session”之外,由于可能存在同步问题,请不要忘记在使用前锁定DataSet。
private static readonly object LockObj = new object();
private static DataSet dataSet = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
if (Session["Counted"] == null)
{
lock (LockObj)
{
dataSet.ReadXml(Server.MapPath("~/counter.xml"));
dataSet.Tables[0].Rows[0]["hits"] = (1 + int.Parse(dataSet.Tables[0].Rows[0]["hits"].ToString())).ToString();
dataSet.WriteXml(Server.MapPath("~/counter.xml"));
dataset.clear();
}
Session["Counted"] = "true";
}
}