我感觉我在这里错过了一些关键的东西。
我尝试遵循有关 http://msdn.microsoft.com/en-us/magazine/cc300437.aspx 的指南。在谷歌上,但我看不到我没有做什么。
我有一些非常基本的代码,我写了这些代码,只是为了让它工作:
默认.aspx代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableSessionState="True" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Demo Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="myLabel" runat="server" Text="foo"></asp:Label>
<asp:LinkButton ID="lnkClickButton" runat="server" OnClick="lnkClickButton_Click" CommandName="Clicky">Click Me</asp:LinkButton>
</div>
</form>
</body>
</html>
默认.aspx.cs代码:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Session["clickcount"] = 0;
Cache["clickscount"] = 0;
}
protected void lnkClickButton_Click(object sender, EventArgs e)
{
Session["clickcount"] = (int)Session["clickcount"] + 1;
Cache["clickscount"] = (int)Cache["clickscount"] + 1;
Label myLabel = ((Label)this.FindControl("myLabel"));
if (myLabel != null)
{
myLabel.Text = "Session: " + Session["clickcount"] + "; Cache: " + Cache["clickscount"] + ";";
}
}
}
我尝试同时使用会话对象和缓存对象来增加值,但无济于事。我每次只得到 1
。注意:这是我的第一个 asp.net 项目,我对 C# 也很陌生。
Page_Load
在每次回发和初始加载时运行。您需要在Page_Load
中指定无回发:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack){
Session["clickcount"] = 0;
Cache["clickscount"] = 0;
}
}
更好的是,指定仅当它还没有值时才应设置它:
protected void Page_Load(object sender, EventArgs e)
{
if (Session["clickcount"] == null){
Session["clickcount"] = 0;
}
}
澄清一下,最好只设置尚未设置的值的原因是,每次有人直接访问该页面时,Page.IsPostBack 都是假的。例如,假设您有页面 http://example.com/Demo/Default.aspx,并且在顶部有一个徽标,您可以在此处包装徽标,每次有人单击徽标时,会话都会重置,即使他们实际上并没有离开页面。如果他们在浏览器上刷新而不重新发布最后一篇文章,也会发生这种情况。
在 MSDN 上读取:Page.IsPostBack 属性 - 获取一个值,该值指示页面是首次呈现还是加载以响应回发。
如果加载页面以响应客户端回发,则属性的 vlue 为 true;否则为 false。
像这样的代码...您需要将代码放入!IsPostBack
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
Session["clickcount"] = 0;
Cache["clickscount"] = 0;
}
}
服务器端控件生成回发以自行分页,因此您不想在每个 postbck 上执行的代码需要如上所述
这将轻松解决您的问题...
此外,您可以像这样为计数创建静态属性
查看我的帖子: 服务器端状态维护变量的编程实践
private int ClickCount
{
get
{
if (Session["clickcount"] == null)
{ Session["clickcount"] = 0; return 0; }
else
return (int)Session["clickcount"] ;
}
set
{
Session["clickcount"] = value;
}
}
比在最终代码中
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
ClickCount = 0;
}
}
protected void lnkClickButton_Click(object sender, EventArgs e)
{
int val = ClickCount ;
ClickCount = val + 1;
}
写作:
Session["clickcount"] = 0;
在Page_Load将导致计数器在用户每次进入页面时重置。
在我看来你想要这样的东西:
protected void lnkClickButton_Click(object sender, EventArgs e)
{
if (Session["clickcount"] == null)
{
Session["clickcount"] = 1;
}
else
{
Session["clickscount"] = (int)Session["clickscount"] + 1;
}
Label myLabel = ((Label)this.FindControl("myLabel"));
if (myLabel != null)
{
myLabel.Text = "Session: " + Session["clickcount"] + ";
}
}
你得到 1,因为每次回发你的会话和缓存变量都等于 0。
protected void Page_Load(object sender, EventArgs e)
{
Session["clickcount"] = 0;
Cache["clickscount"] = 0;
}
并且按钮单击发生在page_load之后,因此您应该使用IsPostback属性。
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
Session["clickcount"] = 0;
Cache["clickscount"] = 0;
}
}
现在,这些变量仅在加载页面时初始化。
您应该通过以下链接。它被描述 Asp.net 页面寿命。
http://msdn.microsoft.com/en-us/library/ms178472.aspx