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

本文关键字:NET ASP 变量 之间 视图 单击 按钮 | 更新日期: 2023-09-27 18:35:34

我感觉我在这里错过了一些关键的东西。

我尝试遵循有关 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# 也很陌生。

如何在页面视图或按钮单击之间以 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