按钮的CountClick方法不起作用

时间:2012-07-24 14:37:32

标签: c# asp.net

我的网页上有几个按钮,并试图通过使用countClick方法来检查用户按下的点击次数来限制按钮点击次数。在下面的代码中,当用户单击第一个按钮时,将自动单击第二个按钮。如果他们要选择第二个按钮,则会自动点击第三个按钮,对其余按钮也是如此。但是在我的情况下,他们只能点击一次,只需点击两个按钮。所以,当他们点击一次时,我不允许他们第二次点击。

我的问题是我的countClick方法无效。当我运行我的页面时,可以选择我的所有按钮,它不会限制用户只按一次按钮。

这是我的.cs代码:

protected void Button1_Click(object sender, EventArgs e)
{
    Button1.Text = "Booked";
    Button1.BackColor = System.Drawing.Color.Blue;
    Button2.Text = "Booked";
    Button2.BackColor = System.Drawing.Color.Blue;
    countButtonClick();
}
protected void Button2_Click(object sender, EventArgs e)
{
    Button2.Text = "Booked";
    Button2.BackColor = System.Drawing.Color.Blue;
    Button3.Text = "Booked";
    Button3.BackColor = System.Drawing.Color.Blue;
    countButtonClick();
}
protected void Button3_Click(object sender, EventArgs e)
{
    Button3.Text = "Booked";
    Button3.BackColor = System.Drawing.Color.Blue;
    Button4.Text = "Booked";
    Button4.BackColor = System.Drawing.Color.Blue;
    countButtonClick();
}
protected void Button4_Click(object sender, EventArgs e)
{
    Button4.Text = "Booked";
    Button4.BackColor = System.Drawing.Color.Blue;
    countButtonClick();
}

这是.cs中的countClick方法:

private void countButtonClick()
{
    int counter = 0;
    counter++;
    if (counter >= 1)
    {
        Response.Write("You can only select 2 slots! " + DateTime.Now.ToString());
    }
}

3 个答案:

答案 0 :(得分:7)

counter存储为会话变量。

因为您在函数中声明它,所以对于该函数调用的特定实例它是唯一的。因此每次都会重置为0.

private void countButtonClick()
{    
    int counter = 0;
    if (!(Session["counter"])){
       counter = (int)Session["counter"];
    }
    counter++;
    Session["counter"] = counter;

    if (counter >= 1)
    {
        Response.Write("You can only select 2 slots! " + DateTime.Now.ToString());
    }
}

我还会通过在页面加载方法中添加以下内容来确保在刷新时丢失会话值:

if (!(Page.IsPostBack)){
   Session["counter"] = null;
}

答案 1 :(得分:4)

我在这里看到两个问题:

首先,counter需要是一个会话变量,其次,您应该在修改页面上的任何内容之前调用countClick(),并使其返回bool以便您可以判断它是否成功或不。

private bool countClick()
{
    if (Session["clicks"] == null)
    {
        Session["clicks"] = 1;
        return true;
    }
    if (++((int)Session["clicks"]) > 1)
    {
         Response.Write("...");
         return false;
    }
    return true;
}


protected void Button1_Click(object sender, EventArgs e)
{
    if (countClick())
    {
        Button1.Text = "Booked";
        Button1.BackColor = System.Drawing.Color.Blue;
        Button2.Text = "Booked";
        Button2.BackColor = System.Drawing.Color.Blue;
    }
}

答案 2 :(得分:3)

您的countButtonClick方法使用counter作为本地范围的变量,方法是在方法内部声明它。这意味着每次调用该方法时,都会创建计数器并将其初始化为0.此外,回发后不会保留点击次数。即使您在countButtonClick之外移动计数器声明,每次单击一个按钮时,计数器变量也会重置为0,因为page lifecycle的工作方式。解决此问题的方法是以某种方式存储计数器,例如会话或视图状态。

private int counter = 0;
protected void Page_Load()
{
   if(!Page.IsPostback)
   {
      ViewState["MyClickCounter"] = 0;
   }
   else
   {
      counter = (int)ViewState["MyClickCounter"];
   }
}
private void countButtonClick()
{
   counter++;
   ViewState["MyClickCounter"] = counter;
   if (counter >= 1)
   {
      Response.Write("You can only select 2 slots! " + DateTime.Now.ToString());
   }
}

您可能还想添加重置方法,具体取决于您的网页需要执行的操作。