asp.net按钮点击事件只发生一次

本文关键字:一次 按钮 net 事件 asp | 更新日期: 2023-09-27 18:25:07

我对ASP.NET很陌生,但我有C和C#的背景。我正在尝试制作将与我的数据库连接的web应用程序。我做到了,这还可以。当我添加用于在数据库中向前和向后移动的按钮时,出现了问题。。。它工作得很好,但只点击了一下!然后我想我可能在代码中有错误,我决定用一种简单的方式来做。

我创建了一个只有一个按钮和一个标签的新web表单,但行为仍然是一样的——第一次点击后事件不会再次触发。有什么帮助吗?

我的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace DummyTest
{
    public partial class WebForm1 : System.Web.UI.Page
    {
    int pom = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Convert.ToString(pom);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        pom++;
        Label1.Text = Convert.ToString(pom);
    }
    }
  }

和源

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs"
 Inherits="DummyTest.WebForm1" %>
 <!DOCTYPE html>
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server">
 <title></title>
 </head>
 <body>
 <form id="form1" runat="server">
 <div>
    Dummy Test
    <br />
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <br />
</div>
</form>
</body>

asp.net按钮点击事件只发生一次

每次请求都会重新创建Webform类,这就是它的工作方式。你需要以其他方式坚持现场pom。您可以将它添加到会话状态中,但这会影响应用程序的可伸缩性,因为您可以在服务器上保持状态。

它已经被标签控件持久化了,所以你可以在点击事件中做这样的事情:

var pom = Int.Parse(Label1.Text);
pom++;
Label1.Text = pom.ToString();

然而,对于你想要坚持的事情,情况并非总是如此。在这种情况下,我会在保存它的html中添加一个隐藏字段。我的WebForms有点生疏,但在您的标记中:

<asp:HiddenField id="pom" value="0" />

然后像上面所做的那样,在click事件中拉出值并递增。

每当您单击int pom = 0时,都会将其初始化为零,然后设置值,这就是它看起来只调用一次的原因。要么使其静止,要么更好地尝试:

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "" + (Convert.ToInt32(Label1.Text) + 1);
}

您可以尝试将初始化移到IsPostBack检查中,这样重新加载页面就不会将变量重新初始化为0。IsPostBack值指示页面是首次呈现还是响应回发而加载,并且按钮单击事件触发回发。

其他
IsPostBack在页面生命周期的特定阶段触发

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
         int pom = 0;
    }
    Label1.Text = Convert.ToString(pom);
}

在某种程度上,这取决于pom变量的用途。如果它跟踪每个用户的点击量,那么上面的内容应该会有所帮助。但是,如果您正在跟踪所有用户的点击,那么您应该考虑其他事情(可能使用global.asax)

它现在正在工作!这是向上和向下的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace DummyTest
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        static int pom;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack == false)
            {
               pom = 0;
               Label1.Text = Convert.ToString(pom);
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
           var pom = Int32.Parse(Label1.Text);
           pom++;
           Label1.Text = Convert.ToString(pom);
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
           var pom = Int32.Parse(Label1.Text);
           pom--;
           Label1.Text = Convert.ToString(pom);
        }
    }
}