如何在页面视图或按钮单击之间增加ASP.NET(C#)中的变量

时间:2012-05-28 10:06:37

标签: c# asp.net

我觉得我在这里缺少一些关键的东西。

我尝试过关注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分。

N.B。这是我的第一个asp.net项目,我也是c#的新手。

4 个答案:

答案 0 :(得分: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 here中包含的徽标,每当有人点击徽标时会重置会话,即使它们实际上没有离开页面。如果他们在浏览器上刷新而没有重新发布最后一篇帖子,也会发生这种情况。

答案 1 :(得分:4)

在MSDN上阅读:Page.IsPostBack Property - 获取一个值,该值指示页面是第一次呈现还是正在加载以响应回发。

如果正在加载页面以响应客户端回发,则

属性vlue true ;否则, false

这样的代码......您需要将代码放在!IsPostBack中,如下所示

protected void Page_Load(object sender, EventArgs e)     
{
     if(!IsPostBack)
    {
         Session["clickcount"] = 0;
         Cache["clickscount"] = 0;
    }
 } 

服务器端控件生成回发以自行分页,因此您不想在每个postbck上执行的代码需要按上面的方式放置

这将很容易解决您的问题...

此外,你可以为这样的计数创建静态属性

查看我的帖子:Programming Practice for Server Side State Maintenance Variable

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; 
}

答案 2 :(得分: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"] + "; 
    }
}

答案 3 :(得分: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