3

我觉得我在这里遗漏了一些关键。

我已经尝试在http://msdn.microsoft.com/en-us/magazine/cc300437.aspx 和谷歌上遵循指南,但我看不到我没有做什么。

我有一些非常基本的代码,我写这些代码只是为了让它工作:

Default.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>

Default.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# 也很陌生。

4

4 回答 4

6

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 都是 false 。比如说你有你的页面http://example.com/Demo/Default.aspx并且在顶部你有一个你在 logo 中包装的标志,每次有人点击这个标志时会话都会被重置,即使他们实际上并没有离开页面。如果他们在浏览器上刷新而不重新发布最后一篇文章,也会发生这种情况。

于 2012-05-28T10:08:56.727 回答
4

在 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; 
}
于 2012-05-28T10:09:39.460 回答
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"] + "; 
    }
}
于 2012-05-28T10:14:24.627 回答
1

您得到 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

于 2012-05-28T10:51:50.530 回答